如何在 C++ 中调用父类中的函数? [复制]

Posted

技术标签:

【中文标题】如何在 C++ 中调用父类中的函数? [复制]【英文标题】:How to call functions from parent class in C++? [duplicate] 【发布时间】: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 中定义的函数冲突。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如何在 C++ 中调用父类中的函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 父类指针如何调用子类的变量和函数 虚函数virtual实例

如何在 C++ 类中调用静态库函数? [复制]

在c++中的继承,如何在子类中重载成员函数

请教,父类中如何调用子类中的虚函数

如何在 C++ 中的类中递归调用函数方法?

c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样