c ++如何使用子类调用函数,具有超类指针

时间:2016-06-10 20:59:25

标签: c++ class pointers inheritance subclass

我有3个班,A,B和C:

$ cat /etc/debian_version 
jessie/sid

class A { public: virtual bool sm(B b) = 0; virtual bool sm(C c) = 0; }; class B : public A { bool sm(B b) { //code } bool sm(C c) { //code } }; class C : public A { bool sm(B b) { //code } bool sm(C c) { //code } }; ,存储B或C对象。 (例如,他们随机生成)
我能以某种方式打电话吗

vector<A*> objects

没有动态演员或其他什么?因为可以有更多的B-C类
它是一个袋子的东西,可能有更好的方法吗?


正如for(int i = 0; i < objects.size(); i++) { for(int j = i; j < objects.size(); j++) { objects[i].sm(objects[j]); } } 所说,我理解,这是我的问题的解决方案

odelande

此代码输出

  

在做B的B中     在C做B
    在B做C
    在C做C

2 个答案:

答案 0 :(得分:0)

你不能这样做。 sm()方法的重载是静态解析的,即在编译时(此外,sm()应该将指针带到BC)。但编译器只知道objects[j]A*;它无法解析调用,因为没有重载需要A*作为输入。

您想要的是根据objects[j]的运行时类型调度调用。这就是对虚函数的调用。所以,你应该只有一个sm()方法,它应该反过来调用它的参数的另一个虚方法。

答案 1 :(得分:0)

您正在搜索访客模式,多次调度。关键是你在sm(A&amp; a)中引用一个引用并在其上调用smT(...) 。 (代码仅用于示例目的,需要清理和修复。)

class A {
protected:
 virtual bool smB(B& b) = 0; 
 virtual bool smC(C& c) = 0; 
public:  
 virtual bool sm(A& a) = 0; 
};  

class B : public A {  
protected:
 bool smB(B& b) {
  // code, 
 }
 bool smC(C& b) {
  // code
 }
public:
 bool sm(A& a) {
  a.smB( *this ); // this is smC(...) in class C
 }
};