我想用 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();
};
我发现的错误是:错误:"new"或"重写"是必需的,因为此声明与函数 A:solve 匹配
如果我使用虚拟double solve(OtherWrapper ^) override;
而不是使用virtual double solve(OtherWrapper ^) =0;
,并且我在.cpp文件中实现了成员函数,那么它可以工作。我希望B_Wrapper是抽象的,这样我就不必实现B_Wrapper::solve(..)
。我错过了什么?
希望我已经清楚了,有人可以帮助我。提前谢谢。
只需从您的B_Wrapper
声明中删除solve
即可。
因为您是从 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();
};
C++/CLI 编译器试图阻止你把脚踢掉。 B_Wrapper类有两个名为 solve(( 的方法。 从A_Wrapper继承的那个和您添加的那个。 添加的隐藏继承的。
此方案是C++中非常常见的错误,在通过添加参数修改虚拟方法时引起。 如果未编辑基方法,则此类方法将不再覆盖该方法。 诊断起来非常棘手。 C++/CLI 语言对此做点什么还为时过早。 后来被采用到 C++11 中,并添加了 override
修饰符。 如果要重写基方法并在打算隐藏时显式使用new
,则必须使用 override
。
这里两者都不是故意的,因为您实际上并没有覆盖抽象方法,并且没有可以想象的理由为什么要隐藏继承的方法。 只需删除 B_Wrapper 中的 solve(( 方法声明,您已经继承了A_Wrapper的声明。
使用"override"关键字解决了这个问题。
基类
ref class DataBackUp
{
public:
virtual void StartBackUp(void) = 0;
};
派生类
ref class FlatBackup : public DataBackUp
{
public:
void StartBackUp(void) override
{
}
};