繁体   English   中英

在C ++中实现纯虚函数

[英]Implementation of a pure virtual function in C++

给定以下情况,我有一个带有纯虚函数void foo() = 0;的基类MyBaseClass void foo() = 0; 从该类MyBaseClass派生两个类MyClassAMyClassB 两者都实现功能foo() 现在在我从事的项目中,我遇到了一个从类MyBaseClass创建的对象,在该对象上调用了foo()函数。 有趣的是,使用的是MyClassB的实现。 在哪里定义的是此实现而不是MyClassA

该对象的类型为MyClassB而不是MyBaseClass MyBaseClass是抽象的,无法实例化。 但是,您可能有一个指向MyClassB实例的指针MyBaseClass*

如果需要更多信息,您可能应该阅读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

我遇到了一个从类MyBaseClass创建的对象

不,你没有。 MyBaseClass类型的对象不存在。 该类是抽象的,无法实例化。

您可能MyBaseClass指向 MyBaseClass指针 ,该指针可以指向继承基类的类的任何对象。

尽管pA指向MyClassB类的对象,有没有一种方法可以调用MyClassA的实现? 也许有演员表?

你可以打电话

pA->MyBaseClass::foo();

但这仅在实现该功能的情况下有效。 (是的,您可以提供纯方法的实现)

重要的是要注意这些片段之间的区别:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM