鉴于以下场景,我有一个带有纯虚函数MyBaseClass
的基类void foo() = 0;
。两个类MyClassA
和MyClassB
派生自该类MyBaseClass
。两者都实现了函数foo()
。
现在在我工作的项目中,我遇到了一个从类MyBaseClass
创建的对象,其中调用了函数foo()
。
有趣的是,这是使用MyClassB
的实现。
在哪里定义它是这个实现而不是来自MyClassA
答案 0 :(得分:4)
对象的类型为MyClassB
,而非MyBaseClass
。 MyBaseClass
是抽象的,无法实例化。但是,您可能有一个指向MyBaseClass*
的指针MyClassB
。
如果您需要更多信息,您应该阅读C ++中的继承和多态。
MyBaseClass base; // Compiler error, cannot instantiate abstract class
MyClassA a;
MyClassB b;
MyBaseClass* pA = &a;
MyBaseClass* pB = &b;
pA->foo(); // Uses implementation of foo in MyClassA
pB->foo(); // Uses implementation of foo in MyClassB
答案 1 :(得分:3)
我遇到了一个从MyBaseClass类创建的对象
不,你没有。类型MyBaseClass
的对象不可存在。该类是抽象的,无法实例化。
你可能会发现一个指针到MyBaseClass
,它可以指向继承基类的类的任何对象。
有没有办法调用MyClassA的实现,虽然pA指向MyClassB类的对象?也许是演员?
你可以打电话
pA->MyBaseClass::foo();
但这仅在实现该功能时才有效。 (是的,你可以提供纯方法的实现)
答案 2 :(得分:1)
重要的是要注意这些片段之间的区别:
struct X
{
virtual void foo() = 0;
};
X x; // not valid! X has purely virtual methods
和
struct X; // as above
struct Y : X
{
void foo() {}
void bar() {}
};
X * x = new Y; // valid!
第二种情况很可能是你所看到的。在此模式中,您可以拨打x->foo();
,然后拨打Y::foo()
。但请注意,您无法拨打x->bar()
,因为X::bar()
不存在。