Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重写类成员变量_C++_Oop - Fatal编程技术网

C++ 重写类成员变量

C++ 重写类成员变量,c++,oop,C++,Oop,我遇到了一个继承问题,我不知道我的解决方案是否优雅。我有这样的课 class Var { public: virtual void doSomething(); } class DerivedVar : public Var { public: virtual void doSomething(); void doSomethingElse(); } 我还有从MyBase继承的MyDerivate。MyBase有一个类型为Var的成员,而MyDerived需要有一个De

我遇到了一个继承问题,我不知道我的解决方案是否优雅。我有这样的课

class Var
{
public:
    virtual void doSomething();
}
class DerivedVar : public Var
{
public:
    virtual void doSomething();
    void doSomethingElse();
}
我还有从MyBase继承的MyDerivate。MyBase有一个类型为Var的成员,而MyDerived需要有一个DerivedVar的成员,这样它才能调用doSomething()。目前,我正在使用模板来解决这个问题

template<typename VarType>
class MyBase
{
protected:
    VarType var;
public:
    MyBase() { var.doSomething(); }
}

class MyDerived : public MyBase<DerivedVar>
{
public:
    MyDerived() : MyBase() { var.doSomethingElse(); }

}
模板
类MyBase
{
受保护的:
变分型;
公众:
MyBase(){var.doSomething();}
}
类MyDerived:publicmybase
{
公众:
MyDerived():MyBase(){var.doSomethingElse();}
}

我想知道是否有更好的方法(例如,不需要使用模板)

如果您想要或需要避免模板化,那么您需要动态分配协变类型数据成员

然后,一个好的方法是向构造函数链上传递工厂(它可以是默认的构造函数参数),并在基类中调用它

一种不好的方法是使用两阶段初始化,但在20世纪90年代初非常流行

好的,我预料到了你们还并没有遇到的问题

但是你会的

也就是说,如果你能让模板方法发挥作用,那可能是最好的


最直接的解决方案、最少的变通方法、代码和设计调整。

如果您不了解CRTP,您可能会觉得阅读CRTP很有趣。嗯。。。如果在堆上添加一级间接寻址和分配对您来说不麻烦,那么您总是可以存储一个指针。。。