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

马萨菲

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

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

没有动态转换或其他内容?因为可能会有更多的BC课程,
并且这是一件手提袋事情,也许有更好的方法可以做到这一点?

解决方案
正如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*; 它无法解决该调用,因为没有将aA*作为输入的重载

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用GraalVM从C ++调用具有非原始类型作为参数的Java入口点方法

在向量C ++中从超类调用子类方法

如何在目标C中使用具有通用类型的Swift类

如何在C#中使用循环调用具有不同名称的数组

在Swift 3中使用具有回调函数指针作为参数的C API函数

有没有办法知道超类构造函数中调用对象的子类?C ++

调用超类函数继承C ++

从Julia调用具有std :: vectors作为输入和输出参数的C ++函数

如何从C#使用结构指针参数调用C ++函数?

C ++如何从具有一个参数的派生类构造函数调用具有两个参数的超类构造函数?

是否有可能在C ++中具有超类的子类的成员

具有子类中的函数的抽象函数的C ++父类

如何在C#中P /调用具有未知结构的函数?

从F#调用具有多个参数的C#函数

复制在C ++中具有自指针的类的构造函数?

C ++:用指向派生类的指针进行的虚函数调用是否仍具有vlookup

C ++:如何保存具有指针作为文件成员的类?

调用具有较少参数的C函数?

子类调用基类构造函数,然后在子类Arduino C ++中使用基类的实例方法

C#-如何使用具有一个属性的接口在类之间进行通信

在C ++中从指针向量访问子类变量到超类

C ++多态性-调用具有不同签名的派生类方法

C ++-使指向超类的指针与函数中的子类参数匹配

如何使用C#反射调用具有通用List参数的扩展方法?

如何使用 C# 使用具有多个函数的事务

如何在C中调用具有函数指针作为参数的函数?

如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?

如何在 C++ 中使用具有另一个类对象的构造函数?

找到一种在 C 中调用具有不同参数的函数的方法