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

c++ how to call function with subclass, having superclass pointer

本文关键字:超类 指针 函数 调用 何使用 子类      更新时间:2023-10-16

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

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
 }
};  

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]);
 }
}

没有动态演员什么的?因为可以有更多的B-C类
这是一个袋子的事情,也许有更好的方法可以做到这一点吗?

溶液
正如odelande所说,我理解,这是我问题的解决方案

#include <iostream>
#include <vector>
class B;
class C;
class A {
public:
    virtual bool sm(A* a) = 0;
    virtual bool sm(B* b) = 0;
    virtual bool sm(C* c) = 0;
};
class B : public A {
public:
    bool sm(A* a) {
        return a->sm(this);
    }
    bool sm(B* b) {
        std::cout << "In B doing B" << std::endl;
        return true;
    }
    bool sm(C* c) {
        std::cout << "In B doing C" << std::endl;
        return false;
    }
};
class C : public A {
public:
    bool sm(A* a) {
        return a->sm(this);
    }
    bool sm(B* b) {
        std::cout << "In C doing B" << std::endl;
        return true;
    }
    bool sm(C* c) {
        std::cout << "In C doing C" << std::endl;
        return false;
    }
};
int main() {
    std::vector<A*> objects;
    objects.push_back(new B());
    objects.push_back(new C());
    objects[0]->sm(objects[0]);
    objects[0]->sm(objects[1]);
    objects[1]->sm(objects[0]);
    objects[1]->sm(objects[1]);
    std::cin.get();
    return 0;
}

此代码输出

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

你不能

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

您想要的是根据运行时类型调度调用 objects[j] 。这就是对虚函数的调用的作用。因此,您应该只有一个sm()方法,而该方法又应该调用其参数的另一个虚拟方法。

您正在搜索访客模式,多次调度。关键是你在sm(A&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
 }
};