抽象类型作为类成员变量的问题
problem with an abstract type as class member variable
我尝试在类定义中使用抽象类类型作为成员变量,但不知何故它有一些问题。下面是抽象类的类型:
class POINT{
public:
virtual int point_dim() = 0;
/*other virtual functions...*/
}
下面是继承的类:
class POINTX : public POINT{
public:
int point_dim(){return 10;}
}
我创建了另一个类,使用POINT作为成员变量,因为POINT是一个纯虚类,所以我只能将它声明为指针:
class SPACE{
public:
POINT* m_point;
/*some other declarations*/
}
但是当我在main中使用它时,它不像我期望的那样工作:
int main(){
POINTX *ptx = new POINTX();
SPACE space;
space.m_point = (POINT*)ptx;
//some function call use POINT as parameter(pass by reference):
func(*space.m_point, ....);
}
调用func(space.m_pint)时发生错误。然而,如果我这样做没有类空间,这是可以的。例如:
int main(){
POINTX *ptx = new POINTX();
POINT *m_point = (POINT*)ptx;
//some function call use POINT as parameter(pass by reference):
func(*m_point, ....);
}
谁知道怎么回事?
POINT
声明:
virtual int point_dim() const = 0;
因此POINTX
必须有一个称为point_dim
的const
方法:
int point_dim() const {return 10;}
如果没有这个,它将有两个point_dim()
方法,一个非const
,一个const
但纯virtual
,留下POINTX
作为抽象。
只要func()
以引用指向POINT
:
int func(const POINT& pt)
{
const int dim = pt.point_dim();
// ...
}
你可以这样调用它:
func(*space.m_point);
另外,请注意这里不需要c风格的强制转换:
space.m_point = ptx;
当你完成时不要忘记delete ptx
!
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查