鉴于以下场景,我有一个MyBaseClass
带有纯虚函数的基类void foo() = 0;
。两个类MyClassA
,并且MyClassB
是从那个类派生的MyBaseClass
。两者都实现了功能foo()
。现在在我从事的一个项目中,我遇到了一个从调用MyBaseClass
函数foo()
的类创建的对象。有趣的是,它MyClassB
是使用的实现。在哪里定义它是这个实现而不是来自MyClassA
问问题
138 次
3 回答
4
该对象的类型为MyClassB
not 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
于 2013-08-09T08:18:33.070 回答
3
我遇到了一个从 MyBaseClass 类创建的对象
不,你没有。类型的对象MyBaseClass
不能存在。该类是抽象的,无法实例化。
您可能遇到了一个指向a的指针MyBaseClass
,它可以指向继承基类的类的任何对象。
尽管 pA 指向 MyClassB 类的对象,但有没有办法调用 MyClassA 的实现?也许有演员表?
你可以打电话
pA->MyBaseClass::foo();
但这仅在实现该功能时才有效。(是的,您可以提供纯方法的实现)
于 2013-08-09T08:16:02.030 回答
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()
不存在。
于 2013-08-09T08:22:16.603 回答