c++ - 在 C++ 的函数调用中完成强制转换是否真的有效?

标签 c++ oop casting virtual base-class

我的代码:

#include <iostream>

using namespace std;

class A
{
public:
    virtual void print(void) { cout << "I am base class" << endl; }
};

class B : public A
{
public:
    void print(void) { cout << "I am class B" << endl; }
};

void mainprint(A *a)
{
    (*a).print();
}

int main()
{
    A a;
    B b;

    B *bp;
    A *ap;

    ap = &b;

    a.print();
    b.print();
    (*ap).print();

    bp = new B();

    mainprint((A *)bp);

    delete bp;

    return 0;
}

输出:

I am base class
I am class B
I am class B
I am class B

我已经在函数调用中将指针(bp)转换为 A 类,但它仍然调用派生类 print!!!

有人可以帮我解释一下吗?

最佳答案

I have casted the pointer(bp) to class A inside the function call, but it still calls the base class print!!!

我假设您的意思是“调用派生类打印”,因为事情就是这样。

这就是虚函数的全部意义所在;选择与对象的实际类型(即“动态类型”)关联的最终覆盖,无论用于调用函数的引用或指针的类型(即“静态类型”)如何。所以选择了 B::print,因为 bp 仍然指向 B 的实例。

如果你想强制调用A::print,你可以这样做:

pb->A::print()

或者,如果您根本不想要多态行为,请移除virtual 规范。

关于c++ - 在 C++ 的函数调用中完成强制转换是否真的有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992068/

相关文章:

C++ 在命名管道中发送对象

php - 如何从发货ID或观察者处获取订单ID?

c++ - 将对象的方法指针传递给接受[静态方法指针/全局函数]指针的函数

自己类中的 C++ 非静态函数指针

c++ - 一台设备上同时有两个 pcap_compile() ?

java - Java中的方法不起作用?

java - 是否可以通过将 "new Object()"转换为泛型类来实例化泛型类?

c++ - 使用 SDK,他们的头文件使用不命名类型的 typedef

c++ - 如何像数组一样访问元组(具有括号重载和类型安全)?

c - -1.0 和 1.0 之间的 double 有多少位精度?