首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >寻找c++成员函数重写(非虚)的解决方案

寻找c++成员函数重写(非虚)的解决方案
EN

Stack Overflow用户
提问于 2011-07-22 09:52:05
回答 5查看 305关注 0票数 1

我有两个类:

代码语言:javascript
运行
复制
struct A {

    template <typename T>
    void print(T& t){ 
        // do sth specific for A
    }
};

struct B : A {

    template <typename T>
    void print(T& t){ 
        // do sth specific for B
    }
};

在这种情况下,不能编译具有虚函数(A和B都继承自虚函数)的更通用基类,因为没有虚for模板。当我尝试在同一“接口”下委托所有A或B对象时,有没有人有办法解决这个问题?提前谢谢你。

诚心诚意,君

EN

回答 5

Stack Overflow用户

发布于 2011-07-22 12:27:06

你可以考虑使用CRTP

代码语言:javascript
运行
复制
template<typename Derived>
struct Base {
  template <typename T>
  void print(T& t){ 
    static_cast<Derived*>(this)->print(t);
  }
};

struct A : Base<A> {
// template print
};

struct B : Base<B> {
// template print
};

示例用法:

代码语言:javascript
运行
复制
template<typename T, typename ARG>
void foo (Base<T>* p, ARG &a)
{
  p->print(a);
}

此方法将被调用为,

代码语言:javascript
运行
复制
foo(pA, i); // pA is A*, i is int
foo(pB, d); // pB is B*, d is double

这是another demo code

票数 3
EN

Stack Overflow用户

发布于 2012-10-19 18:07:39

使用代理类获取B的方法

代码语言:javascript
运行
复制
  class A {
    public:
        friend class CProxyB;
        virtual CProxyB* GetCProxyB() = 0;
    };

    class B;
    class CProxyB
    {
    public:
        CProxyB(B* b){mb = b;} 
        template <typename T>
        void printB(T& t)
        { 
            mb->print(t);
        }       

        B* mb;
    };

    class B:public A {
    public:
        virtual CProxyB* GetCProxyB(){return new CProxyB(this);};

        template <typename T>
        void print(T& t){ 
            printf("OK!!!!!\n");
        }
    };


    int _tmain(int argc, _TCHAR* argv[])
    {
        A* a = new B;

        CProxyB* pb = a->GetCProxyB();

        int t = 0;
        pb->printB(t);

        return 0;
    }
票数 2
EN

Stack Overflow用户

发布于 2011-07-22 10:18:42

有两个选项:

选项一:虚拟化方法,如果用户不提供实现,则使用“基类”。

代码语言:javascript
运行
复制
template <typename T>
struct A {
    virtual void print(T& t);
};

template <typename T>
void A::print(T& t) {
    // do sth specific for A
}

template <typename T>
struct B : A {
    virtual void print(T& t);
};

void B::print(T& t) {
    // do sth specific for B
}

选项二:抽象方法,如果用户不提供实现,代码将不会编译。

代码语言:javascript
运行
复制
template <typename T>
struct A {
    virtual void print(T& t)=0;
};

template <typename T>
struct B : A {

    virtual void print(T& t){ 
        // do sth specific for B
    }
};
template <typename T>
void B::print(T& t){ 
    // do sth specific for B
}

除了上面提到的以外,如果你不把它们设为虚的,派生类就会遮蔽基类方法,而这肯定不是你想要的。因此,是不可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6784893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档