【问题标题】:Assign base class pointer to derived class without using dynamic cast在不使用动态转换的情况下将基类指针分配给派生类
【发布时间】:2014-07-06 14:23:34
【问题描述】:

在这段给定的代码中,我试图在不使用动态转换的情况下将基类指针分配给派生类指针(向下转换)。使用赋值运算符的帮助。

#include<iostream>
using namespace std;

class A
{
 int i;
 public:
  A& operator =( const A& b)  
     {
        i = b.i;
        return *this ;
     }
};

class B:public A
{
int j;
public:
B& operator =( const B& c)  
     {
        A::operator=(c);
        j=c.j;
        return *this ;
    }
};

int main()
{
A *a;
B *b;
    b=a;
return 0;
}

显示错误:A* 到 B* 的转换无效。

【问题讨论】:

  • 向上转换可以在没有转换操作符的情况下完成,而不是其他方式
  • C++ 不做隐式向下转换,你需要使用dynamic_cast。原因是当你向下转型时,“派生类可以添加新的数据成员,而使用这些数据成员的类成员函数将不适用于基类。” (见bogotobogo.com/cplusplus/upcasting_downcasting.php
  • @vsoftco 这意味着没有动态转换就无法向下转换基类....我说得对吗??
  • 是的,也可以看看这里的小教程了解为什么cplusplus.com/doc/tutorial/typecasting

标签: c++ pointers assignment-operator


【解决方案1】:

您必须通过dynamic_caststatic_cast 进行投射(在这种情况下要小心UB)...

在 C++ 中,运行时类型检查是通过 dynamic_cast 实现的。 编译时向下转换由 static_cast 实现,但这 操作不执行类型检查。如果使用不当,可能 产生未定义的行为[1]

而您的赋值运算符将无济于事。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多