我的代码:
#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/