1

我想用 c++/cli 编写一个包装器,以将 c++ 库与 C# 图形界面进行通信。

当我想在 c++/cli 中实现继承时出现了我的问题:想法:抽象类 B 继承自抽象类 A 类 C 继承自抽象类 B

public ref class A_Wrapper abstract
{
public:
A_Wrapper(void);
virtual double solve(OtherWrapper ^) =0;
};       
public ref class B_Wrapper abstract: public A_Wrapper 
{ 
private:
B * nativeLS;
public:
B_Wrapper(void);
virtual double solve(OtherWrapper ^) =0;
virtual B * getNative();
};

我发现的错误是: Error:'new' or 'override' is required 因为这个声明匹配函数 A:solve

如果我使用 virtualdouble solve(OtherWrapper ^) override;而不是 usingvirtual double solve(OtherWrapper ^) =0; 并在 .cpp 文件中实现成员函数,那么它可以工作。我希望 B_Wrapper 是抽象的,这样我就不必实现B_Wrapper::solve(..). 我错过了什么?

希望我已经清楚了,有人可以帮助我。提前致谢。

4

3 回答 3

2

只需solve从您的B_Wrapper.

因为您继承自A_Wrapper,所以该solve方法已被声明。您不需要再次声明它只是为了重申该方法没有实现的事实。

public ref class A_Wrapper abstract
{
public:
    A_Wrapper(void);
    virtual double solve(OtherWrapper ^) =0;
};

public ref class B_Wrapper abstract: public A_Wrapper 
{ 
private:
    B* nativeLS;
public:
    B_Wrapper(void);
    virtual B * getNative();
};
于 2013-09-25T12:19:13.763 回答
1

C++/CLI 编译器正试图阻止你跳脚。B_Wrapper 类有两个名为solve() 的方法。从 A_Wrapper 继承的一个和您添加的一个。添加的隐藏了继承的。

这种情况是 C++ 中非常常见的错误,在通过添加参数修改虚方法时引起。如果基础方法没有被编辑,那么这样的方法将不再覆盖基础方法。诊断相当棘手。C++/CLI 语言很早就对此有所作为。后来在 C++11 中添加了overrides修饰符。如果要覆盖基方法并在打算隐藏时显式使用new ,则必须使用覆盖。

由于您实际上并没有覆盖抽象方法,并且没有任何可以想象的理由要隐藏继承的方法,因此两者都不是在这里的可能性很高。只需删除 B_Wrapper 中的 solve() 方法声明,您已经从 A_Wrapper 继承了一个。

于 2013-09-25T15:06:51.533 回答
0

我通过以下方式解决了“覆盖”关键字。

基类

ref class DataBackUp
{
    public:
       virtual void StartBackUp(void) = 0;
};

派生类

ref class FlatBackup : public DataBackUp 
{
    public:
        void StartBackUp(void) override
        {
        }

};
于 2014-08-18T13:48:58.920 回答