虚函数......为什么这是私有的?

时间:2012-01-26 23:07:25

标签: c++ virtual-functions

我正在努力使下面的代码工作......

#include <list>

template <typename T>
class container{
public:
    virtual T func_x(){
        T temp;
        //do stuff with list<t> test
        return temp;
    }
private:
    std::list<T> test;
};

template <typename T>
class container2 : public container<T>{
public:
    virtual T func_x(){
        T temp;
        //do different stuff with list<T> test
        return temp;
    }
};

我希望能够做的是声明

container<T> x;
container2<T> y;

并且能够访问x的所有公共函数,除了它对func_x的行为不同。

我现在遇到的问题是类container2中的func_x无法使用;

std::list<T> test;

我甚至尝试将类容器完全公开。仍然没有骰子。可以这样做吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

默认情况下,成员private用于类:

template <typename T>
class container2 : public container<T>{
    //************
    // no modifier
    virtual T func_x(){
        T temp;
        //do different stuff with list<T> test
        return temp;
    }
private:
    std::list<T> test;
};

表示func_xprivate,因为未指定修饰符。

您需要明确声明func_x是公开的,就像class container一样。

“只是因为基类中的public并不意味着它会自动地传递给派生类。”

编辑:

如果希望在派生类中可以访问基类成员,则必须将它们声明为protectedpublic。因此,要回答您的后续问题,请更改

private:
    std::list<T> test;

protected:
    std::list<T> test;

此外,将来,请不要编辑问题以询问新问题。您应该创建一个新问题来处理新问题。对于那些看到不再适用于新问题的答案的人来说,这可能会产生误导。

答案 1 :(得分:1)

您需要在类声明中添加public::否则,默认情况下声明的所有成员都是私有的。

template <typename T>
class container2 : public container<T>{
public: // <<==== ADD THIS
    virtual T func_x(){
        T temp;
        //do different stuff with list<T> test
        return temp;
    }
private:
    std::list<T> test;
};

答案 2 :(得分:0)

问题是您的func_x被派生对象隐藏了,因为您已将其重新定义为派生的private

你需要公开它。