【问题标题】:How to call functions from parent class in C++? [duplicate]如何在 C++ 中调用父类中的函数? [复制]
【发布时间】: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 成员访问流时效果很好,但我想使用&lt;&lt;&gt;&gt; 运算符而不调用io 成员和mystream 的任何成员函数和io 成员。现在我必须像这样访问流:

myclass object;
object.io() << "Some output";
object.io().flush();

但我想通过io 函数直接从对象和mystream 的任何成员访问&lt;&lt;&gt;&gt; 运算符,如下所示:

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


【解决方案1】:

直接从父类调用函数很简单,如下:

std::stringstream myobj;
myobj << "Something..."
myobj.std::iostream::flush();

上面的示例直接从std::iostream 调用flush()(这是std::basic_iostream&lt;char&gt; 的typedef)。也可以从父类的父类成员函数:

myobj.std::ostream::flush();

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 2019-07-30
    • 2023-03-21
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多