我正在努力使下面的代码工作......
#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;
我甚至尝试将类容器完全公开。仍然没有骰子。可以这样做吗?
谢谢!
答案 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_x
为private
,因为未指定修饰符。
您需要明确声明func_x
是公开的,就像class container
一样。
“只是因为基类中的public
并不意味着它会自动地传递给派生类。”
编辑:
如果希望在派生类中可以访问基类成员,则必须将它们声明为protected
或public
。因此,要回答您的后续问题,请更改
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
。
你需要公开它。