gpt4 book ai didi

C++ 多重继承与接口(interface)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:52 28 4
gpt4 key购买 nike

大家好

我来自 Java 背景,我在多重继承方面遇到困难。

我有一个名为 IView 的接口(interface),它具有 init() 方法。我想派生一个名为 PlaneViewer 的新类来实现上述接口(interface)并扩展另一个类。 (QWidget)。

我的实现是这样的:

IViwer.h(只有头文件,没有CPP文件):

#ifndef IVIEWER_H_
#define IVIEWER_H_

class IViewer
{
public:
//IViewer();
///virtual
//~IViewer();
virtual void init()=0;
};

#endif /* IVIEWER_H_ */

我的派生类。

PlaneViewer.h

#ifndef PLANEVIEWER_H
#define PLANEVIEWER_H

#include <QtGui/QWidget>
#include "ui_planeviewer.h"
#include "IViewer.h"
class PlaneViewer : public QWidget , public IViewer
{
Q_OBJECT

public:
PlaneViewer(QWidget *parent = 0);
~PlaneViewer();
void init(); //do I have to define here also ?

private:
Ui::PlaneViewerClass ui;
};

#endif // PLANEVIEWER_H

PlaneViewer.cpp

#include "planeviewer.h"

PlaneViewer::PlaneViewer(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}

PlaneViewer::~PlaneViewer()
{

}

void PlaneViewer::init(){

}

我的问题是:

  1. 是否也有必要在 PlaneViewer 接口(interface)中声明方法 init(),因为它已经在 IView 中定义了?

2.我无法编译上面的代码,报错:

PlaneViewer]+0x28): 未定义对“IViewer 的类型信息”的引用collect2: ld 返回 1 个退出状态

我是否必须在 CPP 文件中实现 IView(因为我想要的只是一个接口(interface),而不是实现)?

最佳答案

考虑接口(interface)类的一个好方法是它们指定派生类必须实现的方法。

Is it necessary to declare method init() in PlaneViewer interface also , because it is already defined in IView?

快速回答是,是的,您必须在 IViewer 中实现 init 方法,因为在基类中该方法被声明为纯虚拟的。这意味着任何派生类都必须提供自己对该方法的实现,因为没有实现基类方法。

2.I cannot complie above code ,give error :

PlaneViewer]+0x28): undefined reference to `typeinfo for IViewer' collect2: ld returned 1 exit status

这是一个 g++ 编译器错误,表明(如上所述)您从具有纯虚函数的基派生了一个类,并且该派生类没有实现纯虚方法,因为它必须

哦,还应该注意,您没有多重继承问题,如果只涉及 IViewerPlaneViewer,问题仍然存在。

关于C++ 多重继承与接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3020425/

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