[英]Implementation of a pure virtual function in C++
给定以下情况,我有一个带有纯虚函数void foo() = 0;
的基类MyBaseClass
void foo() = 0;
。 从该类MyBaseClass
派生两个类MyClassA
和MyClassB
。 两者都实现功能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.