class Base{
public:
void counter();
....
}
class Dervied: public Base{
public:
....
}
void main()
{
Base *ptr=new Derived;
ptr->counter();
}
为了确定基类指针指向派生类并使用派生成员函数,我们使用“虚拟”。
同样,我们可以将派生数据成员“虚拟”吗? (数据成员是公开的)
答案 0 :(得分:25)
virtual
是函数说明符 ...
来自标准文档,
7.1.2 Function specifiers
Function-specifiers can be used only in function declarations.
function-specifier:
inline
virtual
explicit
因此没有任何名为虚拟数据成员。
希望它有所帮助...
答案 1 :(得分:15)
不,但你可以创建一个虚函数来返回指向你所谓的虚拟数据成员的指针
答案 2 :(得分:4)
不,在C ++中没有虚拟数据成员。
答案 3 :(得分:2)
我想不是,但你可能会使用虚拟吸气剂和设定器模拟它吗?
答案 4 :(得分:2)
为了确定基类指针指向派生类并使用派生成员函数,我们使用“虚拟”。
这是不正确的。我们创建虚函数以允许派生类提供与基础提供的不同的实现。它不用于标识基类指针指向派生类。
同样,我们可以将派生数据成员“虚拟”吗? (数据成员是公开的)
只有非静态成员函数才能是虚拟的。数据成员不能。
Here's一个包含更多信息的链接
答案 5 :(得分:2)
不,因为这会以无数种意想不到的方式打破封装。无论您想要实现什么,都可以使用受保护的属性和/或虚拟功能来完成。
此外,虚函数是 dispatch 的一种方法(即选择要调用的函数),而不是选择与成员属性对应的内存位置。
答案 6 :(得分:0)
也许你可以用同样的方式看问题:
class VirtualDataMember{
public:
...
}
class DerviedDataMember: public VirtualDataMember{
public:
...
}
class Base{
public:
VirtualDataMember* dataMember;
void counter();
...
}
答案 7 :(得分:0)
一个类不能有一个虚拟成员,例如参见此answer。 但是,使用指针,继承可以拥有类似的东西 和运行时多态。
在以下代码段中,我定义了几何shape
的原型,
具有area
方法。 picture
类具有成员shape* s;
shape
使用s
所指向的picture::show()
的方法。
在此设置中,不希望在之前有picture
的实例
已经给出了shape
的实际实现,因此我们强制picture
为
通过添加虚拟虚函数picture::make_real()
进行抽象。
// prototypes
class shape
{
public:
virtual double area() = 0; // to be defined later
};
class picture
{
protected:
shape* s;
virtual void make_real() = 0; // force picture to be abstract
public:
picture(shape* ptr):
s{ptr}
{}
void show()
{
std::cout << s->area() << '\n';
}
};
接下来,我们实际上实现了一个名为shape
的{{1}}和一个square
类型的
picture
(从字面上看)具有一个square_picture
square
。
shape
可以使用以下代码段测试// actual implementation
class square : public shape
{
double len;
public:
square(double l):
len{l}
{}
double area() override
{
return len*len;
}
};
class square_picture : public picture
{
void make_real() override {} // square_picture is not abstract
public:
square_picture(double l):
picture{new square{l}}
{}
~square_picture()
{
delete s;
}
};
类
square_picture
输出:
int main()
{
square_picture A{2.0};
A.show();
//picture B{nullptr}; // error: picture is abstract
return 0;
}
答案 8 :(得分:0)
我有一个使用对象数组的基类。我从那个类派生了一个使用不同类型对象数组的新类。这两个变量具有完全相同的名称。两个类都添加了虚拟成员函数来处理数组。这些成员函数可以轻松找到正确的变量。成员函数和它们使用的变量在一个公共范围内。
两个类中的虚拟成员函数几乎相同。只是数组的类型发生了变化。
C++ 模板可以实现相同的结果。