【发布时间】:2020-02-10 07:40:20
【问题描述】:
class Base {
public:
Base(int a) : a_(a) {
//do something
someMethod();
//do something else
};
protected:
int a_;
virtual void someMethod() = 0 {};
};
class Derived : Base {
public:
Derived() {
Base::Base(42);
}
protected:
void someMethod() override {
//realisation
}
};
int main() {
Derived *obj = new Derived();
delete obj;
}
这段代码不能工作有两个错误:需要基类的默认构造函数,以及由于使用抽象方法而无法调用基类的带参数构造函数
我的问题是,当我创建class Derived 的对象时,根本没有调用在class Derived 中实现的someMethod()。另外我不想使用class Base的默认构造函数,但是编译器在发誓。
如何更正我的代码以查看我想要的功能?
【问题讨论】:
-
someMethod();应该是编译器的一个大闪烁错误。如果不是,请尽快提交错误报告。还是您间接调用它?virtual void someMethod() = 0 {};也是格式错误的。您发布的代码有一些不相关的问题。我建议你解决它们,以避免这里的答案脱轨。 -
简短的“解决方案”:永远不要从构造函数中调用虚函数。
-
你不能从构造函数中调用虚函数。派生对象尚未创建。
-
@super 你可以从构造函数中调用虚函数。但它将被静态分派,即发送到正在构建的类中的实现。但如果函数是 pure 虚拟的,则不允许这样做。
标签: c++ inheritance constructor virtual abstract