gpt4 book ai didi

C++:派生+基类实现单个接口(interface)?

转载 作者:IT老高 更新时间:2023-10-28 23:13:01 27 4
gpt4 key购买 nike

在 C++ 中,是否可以让基类和派生类实现单个接口(interface)?

例如:

class Interface
{
public:
virtual void BaseFunction() = 0;
virtual void DerivedFunction() = 0;
};

class Base
{
public:
virtual void BaseFunction(){}
};

class Derived : public Base, public Interface
{
public:
void DerivedFunction(){}
};

void main()
{
Derived derived;
}

这失败了,因为 Derived 不能被实例化。就编译器而言,永远不会定义 Interface::BaseFunction。

到目前为止,我发现的唯一解决方案是在 Derived 中声明一个传递函数

class Derived : public Base, public Interface
{
public:
void DerivedFunction(){}
void BaseFunction(){ Base::BaseFunction(); }
};

有没有更好的解决方案?


编辑:如果重要的话,这是我在使用 MFC 对话框时遇到的一个现实问题。

我有一个从 CDialog 派生的对话框类(可以说是 MyDialog)。由于依赖问题,我需要创建一个抽象接口(interface)(MyDialogInterface)。使用 MyDialogInterface 的类需要使用 MyDialog 特有的方法,但也需要调用 CDialog::SetParent。我刚刚通过创建 MyDialog::SetParent 并将其传递给 CDialog::SetParent 解决了这个问题,但想知道是否有更好的方法。

最佳答案

C++ 没有注意到从 Base 继承的函数已经实现了 BaseFunction:该函数必须在派生自 Interface 的类中显式实现。改成这样:

class Interface
{
public:
virtual void BaseFunction() = 0;
virtual void DerivedFunction() = 0;
};

class Base : public Interface
{
public:
virtual void BaseFunction(){}
};

class Derived : public Base
{
public:
virtual void DerivedFunction(){}
};

int main()
{
Derived derived;
}

如果您希望能够只实现其中一个,请将 Interface 拆分为两个接口(interface):

class DerivedInterface
{
public:
virtual void DerivedFunction() = 0;
};

class BaseInterface
{
public:
virtual void BaseFunction() = 0;
};

class Base : public BaseInterface
{
public:
virtual void BaseFunction(){}
};

class Derived : public DerivedInterface
{
public:
virtual void DerivedFunction(){}
};

class Both : public DerivedInterface, public Base {
public:
virtual void DerivedFunction(){}
};

int main()
{
Derived derived;
Base base;
Both both;
}

注意:main 必须返回 int
注意:最好将 virtual 放在派生的成员函数之前,这些函数在基类中是虚拟的,即使不是严格要求也是如此。

关于C++:派生+基类实现单个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/290913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com