C++ 为什么指向基类的派生类指针可以调用派生类成员函数? #包括 使用名称空间std; 结构基{ void doBase(){ 是的,这是一种未定义的行为

C++ 为什么指向基类的派生类指针可以调用派生类成员函数? #包括 使用名称空间std; 结构基{ void doBase(){ 是的,这是一种未定义的行为,c++,class,C++,Class,没有编译时错误,因为您使用了static\u cast-这是一种告诉编译器“我比您更了解类型”的方法。您告诉您的对象是派生的。您对编译器撒谎-因此未定义的行为 它之所以能够工作,是因为doBar()不使用任何派生的成员。“为什么没有编译错误或运行时错误?”为什么应该有?这只是未定义的行为。Re:“为什么没有编译错误或运行时错误?”--只是运气不好。程序的行为是未定义的,有时结果是程序做了您所期望的事情。直到它不做为止。Ok。但是我在派生类中添加了一个int a=3;,并且cout所以是“垃圾值”

没有编译时错误,因为您使用了
static\u cast
-这是一种告诉编译器“我比您更了解类型”的方法。您告诉您的对象是
派生的
。您对编译器撒谎-因此未定义的行为


它之所以能够工作,是因为
doBar()
不使用任何
派生的
成员。

“为什么没有编译错误或运行时错误?”为什么应该有?这只是未定义的行为。Re:“为什么没有编译错误或运行时错误?”--只是运气不好。程序的行为是未定义的,有时结果是程序做了您所期望的事情。直到它不做为止。Ok。但是我在派生类中添加了一个
int a=3;
,并且
cout所以是“垃圾值”对您来说不是错误吗?您希望程序终止时显示一条错误消息吗?这将是定义的行为。未定义的行为意味着程序可以执行任何操作。@Rick--“未定义的行为”这只意味着语言定义没有告诉你程序做什么。这并不意味着坏事会发生,只意味着坏事会发生。@PeteBecker好的:P
#include <iostream>
using namespace std;

struct Base {
    void doBase() {
        cout << "bar" << endl;
    }
};

struct Derived : public Base {
    void doBar() {
        cout << "bar" << endl;
   }
};

int main()
{
    Base b;
    Base* b_ptr = &b;
    Derived* d_ptr = static_cast<Derived*>(b_ptr);
    d_ptr->doBar(); //Why there is no compile error or runtime error?
    return 0;
}