0

鉴于以下场景,我有一个MyBaseClass带有纯虚函数的基类void foo() = 0;。两个类MyClassA,并且MyClassB是从那个类派生的MyBaseClass。两者都实现了功能foo()。现在在我从事的一个项目中,我遇到了一个从调用MyBaseClass函数foo()的类创建的对象。有趣的是,它MyClassB是使用的实现。在哪里定义它是这个实现而不是来自MyClassA

4

3 回答 3

4

该对象的类型为MyClassBnot MyBaseClassMyBaseClass是抽象的,不能实例化。但是,您可能有一个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 回答