How does an inheritant class work in this situation ???
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class A { public: A() { foo(); } ~A() { foo(); } void foo() { cout << 3; } void bar() { foo(); } }; class B : public A { void foo() { cout << 2; } }; int main() { B b; b.bar(); return 0 ; } |
我编译并运行它。结果是333…但我想:当我调用b.bar()时。它将直接指向bar(),然后调用类B中的foo()函数,因为类A中的foo()在类B中被重写。我想结果是323。但我错了。我错过什么了吗?请帮我解释一下它是如何工作的@
问题是,你有一个非虚拟的
尝试:
1 2 3 4 5 6 7 8 9 10 | class A { public: A() { foo(); } virtual ~A() { foo(); } // <<---------- recommendation virtual void foo() { cout << 3; } // <<<--------- solves it void bar() { foo(); } }; class B : public A { void foo() override { cout << 2; } // <<---------- recommendation }; |
其他信息:
使基类中的
在派生类中使用关键字
另一个好的实践是,如果类中至少有一个虚拟函数,则使基类析构函数成为虚拟的。
最后一句话:在b中,
成员
为了通过
1 2 3 4 5 6 7 | class A { public: A() { foo(); } virtual ~A() { foo(); } virtual void foo() { cout << 3; } void bar() { foo(); } }; |
注意,您还可以将析构函数声明为虚拟的;非虚拟析构函数很少有意义。
必须包含虚拟,才能覆盖存储在中的功能。
添加到
1 | virtual void foo() { cout << 3; } |
到B
1 | void foo() override { cout << 2; } |
应该有技巧。虚函数是成员函数,其行为可以在派生类中被重写。与非虚拟函数相反,即使没有关于类的实际类型的编译时信息,也会保留被重写的行为。如果使用指向基类的指针或引用来处理派生类,则对重写的虚拟函数的调用将调用派生类中定义的行为。