这是我的问题。我想要这样的东西:
class A {
protected:
int someInt;
virtual void someFunc() = 0;
};
class B : public A {
protected:
virtual void someFunc() { // uses someInt}
public:
B() {//tell the A inside of B to set someInt to whatever it wants}
};
所以基本上,someInt可以改变,它不是常数,但我希望所有实现A的类都使用A为someInt提供的值。
由于
答案 0 :(得分:4)
您可以在构造函数中使用初始化列表来调用父构造函数:
class A {
protected:
int someInt;
virtual void someFunc() = 0;
A(int x) : someInt(x) {} // Base-class constructor (initialises someInt)
};
class B : public A {
protected:
virtual void someFunc() {}
public:
B() : A(10) {} // Initialises base class via constructor
};
答案 1 :(得分:1)
这是你想要的吗?
class A
{
protected:
int someInt;
public:
A(int _val) : someInt(_val)
{
}; // eo ctor
}; // eo class A
class B : public A
{
public:
B() : A(5) // initialise someInt with 5
{
}; // eo ctor
}; // eo class B
注意,因为“someInt”受到保护,所以无论如何你都可以在B的构造函数中设置它。
B()
{
A::someInt = 5;
}; // eo ctor
答案 2 :(得分:0)
我不确定你想要什么,但如果你在someInt
的构造函数中初始化A
,子类将看到该值。
class A {
public:
A() : someInt(5) {}
protected:
int someInt;
virtual void someFunc() = 0;
};
class B : public A {
protected:
virtual void someFunc() { // uses someInt}
public:
B() {// at this point someInt will already have been initialized to 5}
};
构造子类时,首先执行基类构造函数。
答案 3 :(得分:0)
class A {
protected:
int someInt;
virtual void someFunc() = 0;
A(){//set someInt here}
};
class B : public A {
protected:
virtual void someFunc() { // uses someInt}
public:
B():A() {}
};
受保护的构造函数将实现此目的。如上。使用公共构造函数的解决方案也很好,但由于构造函数不能直接在thr接口上调用,我认为protected更好。