从普通类派生的抽象类。这有效吗? 是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; 结构基{ 虚拟方法(){ 这是合法的
但是如果你想避免diamon模型,有一些是合法的从普通类派生的抽象类。这有效吗? 是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模型,则存在
绝对合法。如果你喜欢的话,将其视为纯虚拟函数的实现。
请参见这里的讨论
绝对合法。如果您愿意,将其视为纯虚拟函数的实现。
请参见此处的讨论从技术上讲,从具体类继承接口(或抽象类)不会有任何问题,但它永远都不是一个好的设计 如果您打算在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存在的问题是有两个相同类型的基类,这会导致歧义。解决该问题的方法是创建一个“钻石模型”钻石模型当然也有一些问题,但虚拟继承并不能避免这些问题。虚拟继承就是创造“钻石模型”的原因。