在C ++中实现纯虚函数

时间:2013-08-09 08:14:04

标签: c++ virtual

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

的实现

3 个答案:

答案 0 :(得分:4)

对象的类型为MyClassB,而非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

答案 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()不存在。