在C++中的函数调用内完成实际的转换是否有效?

inf*_*oop 1 c++ oop virtual casting 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

I am base class
I am class B
I am class B
I am class B
Run Code Online (Sandbox Code Playgroud)

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

有人可以为我阐明这一点.

Mik*_*our 6

我已经将指针(bp)转换为函数调用中的A类,但它仍然调用基类打印!

我假设你的意思是"调用派生类打印",因为那就是发生的事情.

这就是虚函数的重点; 无论用于调用函数的引用或指针的类型(即"静态类型"),都选择与对象的实际类型(即"动态类型")相关联的最终覆盖.因此B::print被选中,因为bp仍然指向一个实例B.

如果您想强制拨打电话A::print,您可以:

pb->A::print()
Run Code Online (Sandbox Code Playgroud)

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