2、继承和派生类的二义性。 1)首先创建一个工程(project),例如Test2。 2)给工程Test2添加B类。 在界面左侧,找到类列表(class explorer)。 右键单击工程名,选择Add|New item|class。 输入类名,添加一个B类,父类为空。 在B.h文件中,输入如下代码进行类的声明: #include<iostream> using namespace std; class B { public: void f1(){cout<<"B::f1"<<endl;} }; 3)给工程Test添加D类。 在界面左侧,找到类列表(class explorer)。 右键单击工程名,选择Add|New item|class。 输入类名,添加一个D类,公有继承自父类B。 在D.h文件中,输入如下代码进行类的声明: #include<iostream> using namespace std; class D:public B{ public: void f1(){cout<<"D::f1"<<endl;} }; 4)在主文件Test2.cpp中,添加如下代码,调试程序并观察输出结果. #include <stdio.h> #include “stdafx.h” void f(B& rb){ rb.f1(); } int _tmain(int argc, _TCHAR* argv[]) { D d; B b,&rb1=b,&rb2=d; f(rb1); f(rb2); return 0; }
时间: 2024-04-22 21:23:38 浏览: 54
这是一个关于C++中继承和派生类二义性的问题。在这段代码中,类B有一个成员函数f1(),而类D公有继承自类B,并且也有一个同名的成员函数f1()。在主函数中,分别创建了类B的对象b和类D的对象d,并且使用了类B的引用rb1和类D的引用rb2来引用它们。然后调用了函数f(),并将rb1和rb2作为参数传递给它。函数f()中调用了对象的成员函数f1()。
观察输出结果可以发现,函数f()中传递的参数分别是类B的引用和类D的引用,但是输出结果都是调用了类B的成员函数f1()。这是因为在C++中,当派生类中有一个和基类同名的成员函数时,如果通过基类的指针或引用调用该函数,则会出现二义性,编译器无法确定应该调用哪一个函数。因此,编译器会选择调用基类中的函数。如果想要调用派生类中的函数,需要使用类D的指针或引用来调用。
阅读全文