【发布时间】:2012-10-11 23:26:22
【问题描述】:
我有以下简单的类
class base
{
public:
int x;
base &set(int y)
{
x = y;
return *this;
}
};
并想创建一个具有附加功能的新功能,例如打印值 x。所以我这样做:
class derived : public base
{
public:
void print()
{
cout << x << endl;
}
};
现在在主程序中我想做类似的事情
D.set(2).print();
但是编译器会抱怨基类没有名为“print”的成员。
如果我尝试使用协变返回类型并将两个类写为
class base
{
public:
int x;
virtual base &set(int y)
{
x = y;
return *this;
}
};
class derived : public base
{
public:
derived &set(int y)
{
x = y;
return *this;
}
void print()
{
cout << x << endl;
}
};
然后该语句工作得很好,但是我不得不在两个类中为“set”重写完全相同的函数体,即使唯一改变的是返回类型。
如果以后我需要更改 base::set 的功能,那么我将不得不通过所有派生类来更改“set”功能...有什么办法可以避免这种情况吗?提前致谢!
【问题讨论】:
-
您实际上是创建
base对象还是打算成为一个“抽象”类? -
您是否有理由不想将
print放在基础上并根据需要覆盖? -
为什么不用前两个类的例子,在基类中做一个虚方法?
-
请分享有关该类变量的定义或分配(新)的代码。 “D”是什么意思?
-
@delnan - 是的,我打算创建基类的对象。
标签: c++ inheritance covariance code-reuse