【发布时间】:2015-06-15 15:01:35
【问题描述】:
我有一个虚拟类A,数据为val 和val2。 val 由A 设置,但val2 应该由A 的子级设置(基于val 的值)。我想强制每个派生类设置val2。以下
#include<iostream>
class A {
public:
A(): val(1), val2(getVal2())
{};
int val;
int val2;
protected:
virtual int getVal2() = 0;
};
class B: public A {
protected:
virtual int getVal2() { return 2*val; };
};
int main(){
B b;
std::cout << b.val2 << std::endl;
}
不工作,因为A 的构造函数调用了一个当时尚未定义的函数(getVal2):
/tmp/cc7x20z3.o: In function `A::A()':
test9.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0x1f): undefined reference to `A::getVal2()'
collect2: error: ld returned 1 exit status
强制派生类显式设置val2 的更好方法是什么?
【问题讨论】:
-
不是
B::getVal2()还没有“定义”(它是);而是调用了A::getVal2(),因为A子对象仍在构建中。 -
你不需要像在 A 的构造函数和 B 的方法
getVal2()那样在函数定义的末尾使用分号;。
标签: c++