C++;通过接口使用从其他几个类继承的类 我学习C++,我对多重继承和接口类感到困惑。
我想要一个从其他几个类继承的类。此外,我希望通过接口使用该派生类。所以我想,派生类应该扩展基类,派生接口应该扩展基类接口。我会用其他语言来做这件事,但是我认为C++没有这样的工作。 这是我认为应该有效的代码:C++;通过接口使用从其他几个类继承的类 我学习C++,我对多重继承和接口类感到困惑。,c++,inheritance,interface,multiple-inheritance,C++,Inheritance,Interface,Multiple Inheritance,我想要一个从其他几个类继承的类。此外,我希望通过接口使用该派生类。所以我想,派生类应该扩展基类,派生接口应该扩展基类接口。我会用其他语言来做这件事,但是我认为C++没有这样的工作。 这是我认为应该有效的代码: #include <iostream> using std::cout; using std::endl; class Base1Itf { public: virtual void blue() = 0; }; class Bas
#include <iostream>
using std::cout;
using std::endl;
class
Base1Itf
{
public:
virtual void blue() = 0;
};
class
Base1Abs
:
public Base1Itf
{
public:
void blue()
{
cout << "blue" << endl;
}
};
class
DerivedItf
:
public Base1Itf
{
public:
virtual void red() = 0;
};
class
Derived
:
public Base1Abs,
public DerivedItf
{
public:
void red()
{
cout << "red" << endl;
}
};
int main()
{
DerivedItf* d = new Derived();
d->red();
d->blue();
delete d;
return 0;
}
在本例中,只实现了一个基类,但还将实现更多的基类
我做错了什么?多谢各位
编辑
如果删除Base1ITF的BASE1ABS继承,以避免菱形问题,编译器显示相同的错误。
< P>这是C++中众所周知的钻石问题。这就是解决问题的方法:#include <iostream>
using std::cout;
using std::endl;
class Base1Itf {
public:
virtual void blue() = 0;
virtual ~Base1Itf() { }
};
class Base1Abs : virtual public Base1Itf {
public:
void blue() override {
cout << "blue" << endl;
}
virtual ~Base1Abs() { }
};
class DerivedItf : virtual public Base1Itf {
public:
virtual void red() = 0;
virtual ~DerivedItf() { }
};
class Derived : public Base1Abs, public DerivedItf {
public:
void red() override {
cout << "red" << endl;
}
virtual ~Derived() { }
};
int main() {
DerivedItf* d = new Derived();
d->red();
d->blue();
delete d;
return 0;
}
#包括
使用std::cout;
使用std::endl;
类Base1Itf{
公众:
虚空蓝()=0;
虚拟~Base1Itf(){}
};
Base1Abs类:虚拟公共Base1Itf{
公众:
void blue()覆盖{
Cuth这是C++中众所周知的钻石问题。这就是你如何解决它:
#include <iostream>
using std::cout;
using std::endl;
class Base1Itf {
public:
virtual void blue() = 0;
virtual ~Base1Itf() { }
};
class Base1Abs : virtual public Base1Itf {
public:
void blue() override {
cout << "blue" << endl;
}
virtual ~Base1Abs() { }
};
class DerivedItf : virtual public Base1Itf {
public:
virtual void red() = 0;
virtual ~DerivedItf() { }
};
class Derived : public Base1Abs, public DerivedItf {
public:
void red() override {
cout << "red" << endl;
}
virtual ~Derived() { }
};
int main() {
DerivedItf* d = new Derived();
d->red();
d->blue();
delete d;
return 0;
}
#包括
使用std::cout;
使用std::endl;
类Base1Itf{
公众:
虚空蓝()=0;
虚拟~Base1Itf(){}
};
Base1Abs类:虚拟公共Base1Itf{
公众:
void blue()覆盖{
您不能创建带有@d4rk4ng31的类的对象吗?是的,通过阅读编译器错误,我知道这一点。但如果可能的话,我不知道如何执行我正在尝试的操作。@d4rk4ng31是的,我知道,但正如标题所述,我想通过接口使用派生类。您必须实现blue()
在Derived
中。相关:您无法使用@d4rk4ng31创建类的对象。是的,我通过阅读编译器错误知道。但我不知道如何执行我正在尝试的操作,如果可能的话。@d4rk4ng31是的,我知道,但正如标题所述,我希望通过接口使用派生类。您必须实现blue()
在派生的
中相关:一些关于虚拟继承的有趣读物:@JoanBotella,从维基百科以外的任何地方学习……相信我,我是根据经验说话的……我想首先推荐一些关于虚拟继承的有趣读物:@JoanBotella,从维基百科以外的任何地方学习迪亚…相信我,我是凭经验说话的…我会给初学者一些建议