我有一个基本的基类和几个继承它的子类。
Class Base{
public:
Base(){};
virtual ~Base();
virtual void foomethod()=0; //Marked as pure virtual
};
Class A : public Base{
A(){}; //Ctor
~A(){}; //Dtor
void foomethod(){ /* DO SOMETHING */ }
}
Class B : public Base{
B(){}; //Ctor
~B(){}; //Dtor
void foomethod(){ /* DO SOMETHING */ }
}
使用上述内容会导致以下用法出错:
Base a = A();
Base b = B();
编译器抱怨函数foomethod()
是纯虚的。
但是,如果使用以下内容,则没有问题。
A a = A();
B b = B();
我原本认为,由于C ++的多态原理,第一个实例应该被接受。我想在子类中强制执行该方法的特定方法。如果它被标记为仅虚拟,则无法保证它将被明确覆盖。
答案 0 :(得分:3)
您的代码存在多个问题,我会尝试获取大部分内容:
如果没有将其标记为虚拟
您无法创建抽象Base
类的对象(方法没有代码)
写作时
Base b = A();
您正在创建两个对象,然后将A对象分配给Base b
对象。这是不可能发生的,因为Base是抽象的,但如果发生这种情况,您可以体验slicing problem。
您在派生类中将析构函数标记为虚拟,但未在Base
中标记(也没有定义),在使用虚拟多态时始终将其标记为virtual
,否则派生的析构函数将不会被称为
这是一种更正确的方法:
#include <iostream>
using namespace std;
class Base{
public:
Base(){};
virtual ~Base() {};
virtual void foomethod()=0; //Marked as pure virtual
};
class A : public Base{
public:
A(){}; //Ctor
virtual ~A(){}; //Dtor
void foomethod(){ cout << "Hello from A"; }
};
class B : public Base{
public:
B(){}; //Ctor
virtual ~B(){}; //Dtor
void foomethod(){ /* DO SOMETHING */ }
};
int main() {
// Base obj; // Can't do that
Base *obj = new A();
obj->foomethod(); // A's one
delete obj;
return 0;
}
哦,这里和那里有一些语法错误..如果你打算从外面使用那些函数,那就是可见性问题..但我相信摘录只是一个伪代码。