tdi*_*ihp 6 c++ polymorphism virtual-functions diamond-problem
这是我的示例代码,它产生错误:
struct Impl
{
int data_size_;
int find(int var){return 0;}
int get(int rowid){return 0;}
};
class Container
{
public:
Container() {}
virtual ~Container() {}
virtual int get_size() = 0;
virtual int get(int rowid) = 0;
};
class SortedContainer : virtual public Container {
public:
virtual int find(int var) = 0;
};
class ContainerImpl : public Container
{
protected:
Impl impl_;
public:
int get_size() {return impl_.data_size_;}
int get(int rowid) {return impl_.get(rowid);}
};
class SortedContainerImpl
: public SortedContainer, public ContainerImpl
{
private:
typedef ContainerImpl Base;
public:
int find(int var){return Base::impl_.find(var);}
};
ContainerImpl ci;
SortedContainerImpl sci;
Run Code Online (Sandbox Code Playgroud)
似乎"SortedContainerImpl"出错,而"ContainerImpl"没问题.
g ++抱怨:
example_b.cpp:42:21: error: cannot declare variable ‘sci’ to be of abstract type ‘SortedContainerImpl’
example_b.cpp:32:7: note: because the following virtual functions are pure within ‘SortedContainerImpl’:
example_b.cpp:13:15: note: virtual int Container::get_size()
example_b.cpp:14:15: note: virtual int Container::get(int)
Run Code Online (Sandbox Code Playgroud)
我从ContainerImpl获取SortedContainerImpl以重用get_size()和get(int)
我不熟悉c ++,这个问题的本质是什么,我该如何解决?
谢谢大家.
Alo*_*ave 16
在C++中有了一个纯虚拟成员函数,你的类就变成了抽象类,你不能创建它的任何对象.
这样的类本身并不是可实例化的.它意味着充当接口.可以从这样的抽象类派生,并提供派生类中所有纯虚函数的实现.
请注意,您的类SortedContainerImpl派生自两个类SortedContainer和ContainerImpl.
SortedContainer反过来派生自Container但它永远不会实现纯虚函数.
您的SortedContainerImpl类有两个单独的Container基类.一个是虚拟的(通过SortedContainer类),另一个是非虚拟的(通过ContainerImpl类).
SortedContainerImpl具有具体实现Container::get_size()和Container::get(int)用于从来自在基ContainerImpl,但不为经由来自在虚拟基础SortedContainer.
解决问题的一种方法是在以下方面给出具体实现SortedContainerImpl:
class SortedContainerImpl
: public SortedContainer, public ContainerImpl
{
private:
typedef ContainerImpl Base;
public:
int find(int var){return Base::impl_.find(var);}
int get_size() {return ContainerImpl::get_size();}
int get(int rowid) {return ContainerImpl::get(rowid);}
};
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建Container一个虚拟基类ContainerImpl,所以SortedContainerImpl只能获得一个虚拟基类Container:
class ContainerImpl : virtual public Container
{
protected:
Impl impl_;
public:
int get_size() {return impl_.data_size_;}
int get(int rowid) {return impl_.get(rowid);}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47686 次 |
| 最近记录: |