【发布时间】:2021-02-26 17:38:28
【问题描述】:
假设我刚刚创建了一个名为 Base 的类,其中包含 2 或 3 个成员,就是这样:
class Base
{
private:
std::string name;
std::string number;
public:
virtual std::string get() const;
virtual void set();
//...
};
在下一步中,我想从这个类中创建一些派生类。但在某些派生类中,我不需要基类的所有成员。
如何在派生类中排除基类的某些成员而保留其他成员?
例如:
class Derived_One : public Base {
private:
std::string wight;
int A;
public:
//...
};
我只想保留基类的第一个属性 (std::string name) 并删除第二个属性 std::string number。如何在派生类Drive_One中排除它?
我正在寻找一种优雅的解决方案来应对这种变化或我还不知道的广为人知的设计模式。
【问题讨论】:
-
您根本不需要
name成员,还是想要自己的覆盖?或者只是阻止通过get()进行公共访问? -
你不能。假设您将
Drived_one对象传递给接受Base参数的函数foo(),foo()可以访问Base对象的number成员。如果删除派生类的成员,就会破坏 C++ 基/派生多态性。 -
如果派生类不需要基类拥有的东西,那么它不应该从它派生。这表明您的基类至少做了两个正交的事情,这对于单个类来说已经太多了
-
但是解决方案是什么?只是编写几个独立的类,尽管其中一些代码是特别相同的?
-
上下文太少。解决什么?在
Base和Derived_One不想从Base继承的情况下,解决方案是不要从Base继承;)。继承不是解决一切的办法。只选择一些成员来继承是不可能的