具有多重继承的C ++类型转换

时间:2017-02-09 10:28:35

标签: c++ casting multiple-inheritance

mother对象如何在对father进行类型转换时调用son的函数?

此处未创建father对象,然后调用drive()函数。对不起新手问题。

#include <iostream>
using namespace std;

#include <iostream>
using namespace std;
class father
{
    public:
    void drive(){cout<<"Driving";}
};
class mother
{
    public:
    void cook(){cout<<"Cooking";}
};
class son: public father, public mother
{

};
int main() {
    // your code goes here
    mother *m = new mother();
    son* s = static_cast<son *>(m);
    s->drive();
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您的代码具有未定义的行为,因为您尝试通过类型mother访问类型为son的对象,而 func registerLocal(sender: AnyObject) { let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings) } 不是对象的动态类型。

更确切地说,标准中的[basic.lval]表示:

  

如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义: 56

     
      
  • 对象的动态类型,
  •   
  • 对象的动态类型的cv限定版本,
  •   
  • 类似于对象的动态类型的类型
  •   
  • 与对象的动态类型对应的有符号或无符号类型的类型
  •   
  • 与对象的动态类型的cv限定版本对应的有符号或无符号类型的类型,
  •   
  • 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(递归地,包括子聚合或包含联合的元素或非静态数据成员),
  •   
  • 一种类型,它是对象动态类型的(可能是cv限定的)基类类型,
  •   
  • char或unsigned char类型。
  •   

引用cppreference.com

  

未定义的行为 - 对程序的行为没有任何限制。未定义行为的示例是数组边界外的内存访问,有符号整数溢出,空指针解除引用,在没有序列点的表达式中多次修改相同标量,通过不同类型的指针访问对象等。编译器不需要诊断未定义的行为(尽管诊断出许多简单的情况),并且编译的程序不需要做任何有意义的事情。

答案 1 :(得分:2)

取消引用类型son*的指针,当它指向类型的对象或从son派生时(即指向的对象具有不兼容的类型)具有未定义的行为。

  

为什么妈妈的对象能够......

行为未定义。