【发布时间】:2020-11-20 08:10:20
【问题描述】:
TL;DR
我有一个类,其中一些函数名与父类的函数冲突。 C++中如何从父类调用函数?
我的问题
我正在尝试创建一个具有流功能的类。所以,我从 std::basic_iostream 继承了我的课程。但是我的类有很多与基类冲突的功能。因此,我为流定义了一个专用类,并在主类中定义了一个返回流对象的函数。我以这种方式实现了主类的构造函数,因此它将在对象创建时创建流对象。我的代码是这样的:
class mystream : public std::basic_iostream<char> {
...
};
class myclass {
protected:
mystream* stream;
public:
myclass() {
stream = new mystream(args);
}
mystream& io() {
return (*stream);
}
};
我现在要做什么
当我使用io 成员访问流时效果很好,但我想使用<< 和>> 运算符而不调用io 成员和mystream 的任何成员函数和io 成员。现在我必须像这样访问流:
myclass object;
object.io() << "Some output";
object.io().flush();
但我想通过io 函数直接从对象和mystream 的任何成员访问<< 和>> 运算符,如下所示:
myclass object;
object << "Some output";
object.io().flush();
我尝试了什么
我试图将它添加到我的课程中,但它行为不端并且无法处理像 std::endl 这样的 IO 操纵器:
template <typename type>
std::ostream& operator << (type data) {
return ((*stream) << data);
}
template <typename type>
std::istream& operator >> (type &data) {
return ((*stream) >> data);
}
【问题讨论】:
-
不要使用拥有裸指针。目前,您的课程会泄漏内存。
-
更详细地描述“无法处理”和“行为不端”。它的行为如何?相反,您的预期是什么?
-
创建具有流功能的类的常规方法是编写从
std::streambuf派生的类。所有 iostream 类都是不同 streambuf 派生类的包装器。如果您采用这种方法,您将“免费”获得所有 iostream 功能。 -
要确认约翰的声明,这里有一个链接,上面写得很好artofcode.wordpress.com/2010/12/12/deriving-from-stdstreambuf
-
@john @francis 我知道如何定义具有流功能的类。但我的问题是我的类中的许多函数与
basic_iostream中定义的函数冲突。
标签: c++ class base-class