gpt4 book ai didi

c++ - 为什么 C++ 没有虚拟变量?

转载 作者:IT老高 更新时间:2023-10-28 12:30:51 30 4
gpt4 key购买 nike

这可能已经被问过一百万次,或者可能非常愚蠢,但为什么没有实现?

class A
{
public:
A(){ a = 5;}
int a;
};

class B:public A
{
public:
B(){ a = 0.5;}
float a;
};

int main()
{
A * a = new B();

cout<<a->a;
getch();
return 0;
}

此代码将访问 A::a。我如何访问 B::a?

最佳答案

访问 B::a:

cout << static_cast<B*>(a)->a;

显式访问 A::a 和 B::a:

cout << static_cast<B*>(a)->A::a;
cout << static_cast<B*>(a)->B::a;

(dynamic_cast有时比static_cast好,但这里不能用,因为A和B不是多态的。)

至于为什么 C++ 没有虚变量:虚函数允许多态;换句话说,它们通过调用代码让两个不同类型的类被视为相同,这两个类的内部行为的任何差异都被封装在虚函数中。

虚拟成员变量没有意义;没有任何行为可以通过简单地访问变量来封装。

还要记住,C++ 是静态类型的。虚函数让你在运行时改变行为;您的示例代码不仅试图改变行为,而且试图在运行时改变 数据类型(A::a is int, B::afloat),而 C++ 不能那样工作。如果您需要在运行时适应不同的数据类型,则需要将这些差异封装在隐藏数据类型差异的虚拟函数中。例如(仅演示代码;对于实际代码,您将 overload operator<< instead ):

class A
{
public:
A(){ a = 5;}
int a;
virtual void output_to(ostream& o) const { o << a; }
};

class B:public A
{
public:
B(){ a = 0.5;}
float a;
void output_to(ostream& o) const { o << a; }
};

另外请记住,像这样公开成员变量可能会破坏封装,并且通常不受欢迎。

关于c++ - 为什么 C++ 没有虚拟变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3248255/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com