C++ 在这种情况下继承类是如何工作的??? A类{ 公众: A(){foo();} ~A(){foo();} void foo(){cout
问题是您有一个非虚拟的C++ 在这种情况下继承类是如何工作的??? A类{ 公众: A(){foo();} ~A(){foo();} void foo(){cout,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,问题是您有一个非虚拟的foo(),因此a::bar()将调用它知道的唯一的foo(),即a::foo(),即使调用它的是B 尝试: class A { public: A() { foo(); } ~A() { foo(); } void foo() { cout << 3; } void bar() { foo(); } }; class B : public A { void foo() { cout << 2; } }; in
foo()
,因此a::bar()
将调用它知道的唯一的foo()
,即a::foo()
,即使调用它的是B
尝试:
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 ;
}
A类{
公众:
A(){foo();}
virtual~A(){foo();}/必须包含virtual才能覆盖存储在中的功能
添加到
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
};
virtualvoidfoo(){cout成员A::foo
是非虚拟的,因此无论在何处使用都将静态绑定。因此,在编译A::bar
时,对foo()
的调用将(静态)绑定到实现A::foo()
。A::foo
中的静态绑定不会因为您稍后创建派生类B
的实例而改变。
但是,如果在main中调用b.foo()
,将绑定b::foo
为了通过A::bar
调用B::foo
,您必须将A::foo
声明为“虚拟:
void foo() override { cout << 2; }
A类{
公众:
A(){foo();}
虚拟~A(){foo();}
虚拟void foo(){我想你是不是想要一个virtual foo()
My Second:1)即使你将foo()实现为一个虚拟函数,一旦在“a”构造函数中调用,它将运行a::foo()而不是B::foo(),因为还没有创建“B”;2)你不能在析构函数中调用任何虚拟函数,因为“B”可能已经被破坏,取消引用B::foo()指针可能会使应用程序崩溃,或者处理已经被覆盖的内存,或者其他事情。这里我们还不讨论虚拟继承,它会让事情变得更加棘手。
void foo() override { cout << 2; }
class A {
public:
A() { foo(); }
virtual ~A() { foo(); }
virtual void foo() { cout << 3; }
void bar() { foo(); }
};