c++ - 在 C++ 中采用基类指针的函数,该指针重载了指向子类的指针

标签 c++ inheritance

这是我的示例代码:

#include <iostream>
#include <vector>
#include <string>

class Animal {

};

class Rabbit : public Animal {

};

class Caller {
    public:
    virtual void call(Animal* a) {
        std::cout << "Caller calls animal" << std::endl;
    }

    virtual void call(Rabbit* r) {
        std::cout << "Caller calls rabbit" << std::endl;
    }
};


int main(int argc, char** argv) {
    std::vector<Animal*> v;
    Caller c;
    auto a = new Animal();
    auto r = new Rabbit();
    v.push_back(a);
    v.push_back(r);


    for(auto elem : v) {
        c.call(elem);
    }


    return 0;
}

这段代码的输出可以在这里找到

http://ideone.com/I29g3A

它输出:

Caller calls animal
Caller calls animal

我想知道,如果不将特定元素转换为 Rabbit*,是否有办法让 call(Rabbit *r) 方法被调用?

最佳答案

当然可以,例如,通过在您的多态类系统中跳过合适的访问者。不过,我认为您需要使用两个名称来代替 call()。我使用了 pubCall()call()

#include <iostream>
#include <vector>
#include <string>

class Visitor;

class Animal {
public:
    virtual void visit(Visitor&);
};

class Rabbit : public Animal {
    void visit(Visitor&);
};

class Visitor
{
public:
    virtual void call(Animal* a) = 0;
    virtual void call(Rabbit* r) = 0;
};

void Animal::visit(Visitor& v) {
    v.call(this);
}

void Rabbit::visit(Visitor& v) {
    v.call(this);
}

class Caller
    : Visitor {
public:
    void pubCall(Animal* a) { a->visit(*this); }

private:
    virtual void call(Animal* a) {
        std::cout << "Caller calls animal" << std::endl;
    }

    virtual void call(Rabbit* r) {
        std::cout << "Caller calls rabbit" << std::endl;
    }
};


int main(int argc, char** argv) {
    std::vector<Animal*> v;
    Caller c;
    auto a = new Animal();
    auto r = new Rabbit();
    v.push_back(a);
    v.push_back(r);


    for(auto elem : v) {
        c.pubCall(elem);
    }


    return 0;
}

关于c++ - 在 C++ 中采用基类指针的函数,该指针重载了指向子类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20011294/

相关文章:

c++ - QTreeView 清除选择如果选择的项目被过滤

java - 查找 (x,y) 坐标之间的最大距离

C++多重继承/虚继承

java - 泛型继承

inheritance - 抑制 Dokka 对 "No documentation for com.foo.Bar$toString()"的提示?

c++ - 是否可以使 c++ 中的回调函数返回一个值?

c++ - C 套接字 : Echo server bad reply

C# 不能覆盖继承的成员

java - 父类(super class)和基类的构造函数中的调用层次结构

Java 继承 : Reducing visibility in a constructor vs inherited method