如何在函数中判断传递的对象指向的是哪个类

本文介绍了一个C++程序,该程序通过使用dynamic_cast操作符来判断一个基类指针所指向的对象的具体类型,并返回相应的字符串表示。这适用于理解C++中的多态性和动态类型检查。

Three classes A, B and C are shown below:

class A {
public:
virtual ~A() {};
};
class B: public A {};
class C: public B {};

You are to implement a function string verify(A *), such that it returns "grandpa" if the passed-in argument points to a class A object, and "father" for a class B object , "son" for a class C object.

Your submitted source code should include the whole implementation of the function verify, but without any class defined above.
No main() function should be included.

主程序:

#include <iostream>  
#include <string>  
 
using namespace std;  
   
class A {  
public:  
     virtual ~A() {};  
 };  
 class B: public A {};   
 class C: public B {};   
   
 #include "source"  
   
 int main()  
 {  
     A a;  
     B b;  
     C c;  
     cout<<verify(&a)<<endl;  
     cout<<verify(&b)<<endl;  
     cout<<verify(&c)<<endl;  
   
     return 0;  
 } 

答案程序 "source":

string verify(A *p)
{
  if (dynamic_cast<C*>(p))
     return "son";
  else if (dynamic_cast<B*>(p))
     return "father";
  else
     return "grandpa";
}


在 C++ 中,对象传递方式取决于函数参数的定义形式。具体来说,可以通过函数声明中的参数类型判断是引用传递还是地址(指针)传递。 ### 引用传递 如果函数参数定义为某个类型的引用(使用 `&` 符号),则该参数是通过引用传递。在这种方式下,函数内部对形参的任何修改都会直接影响到实参本身。引用传递避免了对象的拷贝,提高了效率,尤其适用于大型对象类型。例如: ```cpp void modifyByReference(MyClass& obj) { obj.setValue(100); // 修改会影响调用者传递对象 } ``` 调用时直接传递对象: ```cpp MyClass obj; modifyByReference(obj); // obj 会被修改 ``` 引用传递的语义更接近于直接操作实参,形参是实参的一个别名,因此对形参的操作等价于对实参的操作[^1]。 ### 地址传递(指针传递) 如果函数参数定义为某个类型的指针(使用 `*` 符号),则该参数是通过地址传递。在这种方式下,函数接收到的是实参的内存地址,通过解引用操作符 `*` 可以修改实参的内容。例如: ```cpp void modifyByPointer(MyClass* objPtr) { objPtr->setValue(100); // 修改会影响调用者传递对象 } ``` 调用时需传递对象的地址: ```cpp MyClass obj; modifyByPointer(&obj); // obj 会被修改 ``` 指针传递本质上是值传递传递的是地址值。函数内部对指针的修改(如改变指针指向)不会影响主调函数中的原始指针变量,但可以通过指针修改其所指向对象的内容[^2]。 ### 如何判断传递方式 判断对象是通过引用还是地址传递,只需查看函数定义中的参数类型: - 如果参数类型是 `T&`(如 `MyClass&`),则是引用传递。 - 如果参数类型是 `T*`(如 `MyClass*`),则是地址传递。 引用传递通常用于避免对象拷贝并简化语法,而地址传递则适用于需要操作内存地址或动态内存管理的场景[^3]。 ### 示例代码对比 ```cpp #include <iostream> using namespace std; class MyClass { public: int value; MyClass(int v) : value(v) {} void setValue(int v) { value = v; } }; // 引用传递 void referenceFunc(MyClass& obj) { obj.setValue(200); cout << "引用传递对象地址:" << &obj << endl; } // 地址传递 void pointerFunc(MyClass* objPtr) { objPtr->setValue(300); cout << "地址传递对象地址:" << objPtr << endl; } int main() { MyClass obj(100); cout << "实参地址:" << &obj << endl; referenceFunc(obj); cout << "引用传递后值:" << obj.value << endl; pointerFunc(&obj); cout << "地址传递后值:" << obj.value << endl; return 0; } ``` ### 总结 - **引用传递**使用 `&`,形参是实参的别名,直接操作实参。 - **地址传递**使用 `*`,传递的是实参的地址,通过解引用操作修改对象。 - 引用传递避免了指针的复杂性,适用于大多数需要修改实参的场景;而地址传递更灵活,适用于需要操作指针本身的场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值