Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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++中的一个有效的设计?< /P> #include <iostream> #include <memory> using namespace std; struct Base { virtual void SomeMethod() { std::cout<<"Do Something"<<std::endl; } }; struct Der : public Base { virtual void SomeMethod() override = 0; }; struct DerDer : Der { virtual void SomeMethod() override { std::cout<<"Do something derived."<<std::endl; } }; int main(int argc, char *argv[]) { auto x = std::unique_ptr<Base>(new DerDer); x->SomeMethod(); return 0; } #包括 #包括 使用名称空间std; 结构基{ 虚拟方法(){ 这是合法的_C++_Class_Polymorphism_Overriding - Fatal编程技术网

从普通类派生的抽象类。这有效吗? 是C++中的一个有效的设计?< /P> #include <iostream> #include <memory> using namespace std; struct Base { virtual void SomeMethod() { std::cout<<"Do Something"<<std::endl; } }; struct Der : public Base { virtual void SomeMethod() override = 0; }; struct DerDer : Der { virtual void SomeMethod() override { std::cout<<"Do something derived."<<std::endl; } }; int main(int argc, char *argv[]) { auto x = std::unique_ptr<Base>(new DerDer); x->SomeMethod(); return 0; } #包括 #包括 使用名称空间std; 结构基{ 虚拟方法(){ 这是合法的

从普通类派生的抽象类。这有效吗? 是C++中的一个有效的设计?< /P> #include <iostream> #include <memory> using namespace std; struct Base { virtual void SomeMethod() { std::cout<<"Do Something"<<std::endl; } }; struct Der : public Base { virtual void SomeMethod() override = 0; }; struct DerDer : Der { virtual void SomeMethod() override { std::cout<<"Do something derived."<<std::endl; } }; int main(int argc, char *argv[]) { auto x = std::unique_ptr<Base>(new DerDer); x->SomeMethod(); return 0; } #包括 #包括 使用名称空间std; 结构基{ 虚拟方法(){ 这是合法的,c++,class,polymorphism,overriding,C++,Class,Polymorphism,Overriding,但是如果你想避免diamon模型,有一些是合法的 但如果你想避免DIAMON模型,则存在绝对合法。如果你喜欢的话,将其视为纯虚拟函数的实现。 请参见这里的讨论绝对合法。如果您愿意,将其视为纯虚拟函数的实现。 请参见此处的讨论从技术上讲,从具体类继承接口(或抽象类)不会有任何问题,但它永远都不是一个好的设计 如果您打算在Der中提供一些常用功能,可以使用组合。因为您的类Der将类似于实用程序类。不要将Der类作为抽象类 Class DerDer : class base { private d

但是如果你想避免diamon模型,有一些是合法的


但如果你想避免DIAMON模型,则存在

绝对合法。如果你喜欢的话,将其视为纯虚拟函数的实现。


请参见这里的讨论

绝对合法。如果您愿意,将其视为纯虚拟函数的实现。


请参见此处的讨论

从技术上讲,从具体类继承接口(或抽象类)不会有任何问题,但它永远都不是一个好的设计

如果您打算在Der中提供一些常用功能,可以使用组合。因为您的类Der将类似于实用程序类。不要将Der类作为抽象类

Class DerDer : class base
{
  private der ptrUtilityObj;
}

将来,可能会有一些新的开发人员会混淆他应该在基类或Der类中引入新的功能。

从技术上讲,这不会有任何问题,但当您从具体类继承接口(或抽象类)时,它永远都不是一个好的设计

如果您打算在Der中提供一些常用功能,可以使用组合。因为您的类Der将类似于实用程序类。不要将Der类作为抽象类

Class DerDer : class base
{
  private der ptrUtilityObj;
}

将来,可能有一些新开发人员会混淆他应该在基类或Der类中引入新功能。

Der::SomeMethod
也应该是
override
。您应该通过
Base*
:@mch Better?:)…
Der::SomeMethod
调用方法所有的方法都是通过
Base*
:@mch Better?:)…链接问题的答案显示了如何创建菱形层次结构。而不是如何避免它。@user2079303我本来想这么说的。你比我强!嗯,我认为正确的句子是:“避免diamon模型的问题”:)@amchacon在技术上也不太正确。链接问题的OP存在的问题是有两个相同类型的基类,这会导致歧义。解决这个问题的方法是创建一个“菱形模型”。钻石模型当然也有问题,但虚拟继承并不能避免这些问题。虚拟继承是“钻石模型”的创造。链接问题的答案显示了如何创建钻石形状的层次结构。而不是如何避免它。@user2079303我本来想说的。你比我强!嗯,我认为正确的句子是:“避免diamon模型的问题”:@amchacon在技术上也不太正确。链接问题的OP存在的问题是有两个相同类型的基类,这会导致歧义。解决该问题的方法是创建一个“钻石模型”钻石模型当然也有一些问题,但虚拟继承并不能避免这些问题。虚拟继承就是创造“钻石模型”的原因。