我的抽象类中的派生类有问题 例如:
#include <iostream>
using namespace std;
class A
{
protected:
int a,b;
public:
A(): a(0), b(0) {}
A(int na,int nb): a(na), b(nb) {}
virtual void print() = 0; // Reason to be an abstract class
};
class B : public A
{
public:
B(int a, int b) {A(a,b);}
void print()
{
cout << a << endl;
cout << b << endl;
}
};
int main(){
B clase(3,2);
clase.print();
return 0;
}
上面的代码给出了这样的错误:
lab1.cpp: In constructor ‘B::B(int, int)’:
lab1.cpp:20:10: error: invalid cast to abstract class type ‘A’
A(a,b);
^
lab1.cpp:5:7: note: because the following virtual functions are pure within ‘A’:
class A
^
lab1.cpp:12:16: note: virtual void A::print()
virtual void print() = 0;
^
注意:我知道如何使其工作,B构造函数将如下所示:
B(int a, int b): A(a,b) {}
但我真正的问题是,如果我想在分支中调用派生类的构造函数(如上面的代码),该怎么办? 在分支中调用抽象构造函数的正确方法是什么?
答案 0 :(得分:1)
在分支内调用抽象构造函数的正确方法是什么?
没有。
这是有充分理由的。必须在构建类之前构造超类。
当你为构造函数编写代码时,你有一个合理构造的对象。你的父母至少是构建的。
使用构造函数的初始化语法巧妙地表达了这一点。
B::B(int a, int b):A(a, b) {
// A is complete. now we can do stuff.
答案 1 :(得分:0)
你必须在不在B构造函数体内的member-initializer列表中初始化b的a部分:
class A
{
virtual void print() = 0 {cout << "I am Pure function";}
};
class B : public A
{
public:
B(int a, int b) : A(a,b) {}
// B(int a, int b) {A(a,b);} /. incorrect
void print()
{
cout << a << endl;
cout << b << endl;
}
};