c++ - 基于策略的设计中的模糊继承

标签 c++ templates inheritance ambiguity policy-based-design

我有一个主机类,它采用两个策略:sayhellotalk。策略 talk 是一个类模板,它本身采用例如打个招呼。 问题是 sayhello::saySomethinghost2 中不明确(我尝试用 virtual 解决这个菱形继承(钻石问题))。

我该如何解决这个歧义?或者对于此类问题是否有更好的设计?

示例:

#include <iostream>

class sayhello {
protected:
    void saySomething(void) {
        std::cout<<"Hello!"<<std::endl;
    }
};

template<typename T>
class talk : private T {
protected:
    void doSomething(void) {
        T::saySomething();
    }
};

template<typename T>
class host1 : virtual T {
public:
    void hostAction(void) {
        T::doSomething();
    }
};

template<typename T, typename L>
class host2 : private T, private L {
public:
    void hostAction(void) {
        T::doSomething();
        L::saySomething();
    }
};

int main() {
    host1<talk<sayhello> > HOST1;
    HOST1.hostAction(); // ok that works

    host2<talk<sayhello>,sayhello> HOST2;
    HOST2.hostAction(); // error, ambiguity!

    return 0;
}

最佳答案

您可能滥用继承,但只需在 talkhost2 中添加几个 virtual 关键字即可:

#include <iostream>

class sayhello {
protected:
    void saySomething(void) {
        std::cout<<"Hello!"<<std::endl;
    }
};

template<typename T>
class talk : virtual T {
protected:
    void doSomething(void) {
        T::saySomething();
    }
};

template<typename T>
class host1 : virtual T {
public:
    void hostAction(void) {
        T::doSomething();
    }
};

template<typename T, typename L>
class host2 : virtual T, virtual L {
public:
    void hostAction(void) {
        T::doSomething();
        L::saySomething();
    }
};

int main() {
    host1<talk<sayhello> > HOST1;
    HOST1.hostAction(); // ok that works

    host2<talk<sayhello>,sayhello> HOST2;
    HOST2.hostAction(); // error, ambiguity!

    return 0;
}

Live Example

关于c++ - 基于策略的设计中的模糊继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19471868/

相关文章:

Python C++ 扩展单例

c++ - 关于 UDP/IP 和 sendto/recvfrom 返回值的混淆

c++ - 传递指针参数时意外的模板实例化

php - 如何在 Kohana 3.1 中的 HMVC 子请求后保留变量的值?

c# - 是否可以为不同的类型创建一个通用的抽象父类?

kotlin - 通用接口(interface)继承

c++ - Unicode 字符无法从文件中正确加载

C++成员函数定义类前缀快捷方式(也是模板)

java - 接口(interface)是 "Object"吗?

c++ - 更新类变量 Qt 信号和槽