Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何调用类与其基类之间的接口?_C++_Oop_Design Patterns - Fatal编程技术网

C++ 如何调用类与其基类之间的接口?

C++ 如何调用类与其基类之间的接口?,c++,oop,design-patterns,C++,Oop,Design Patterns,注意:我标记了设计模式,只是(不太可能)它实际上是一种模式。如果不是,我就把标签去掉 考虑这个例子: template <class _base> struct SplitPrint: public _base { virtual void printPositive(int positive) = 0; virtual void printNegative(int negative) = 0; void print( int number) override

注意:我标记了设计模式,只是(不太可能)它实际上是一种模式。如果不是,我就把标签去掉

考虑这个例子:

template <class _base>
struct SplitPrint: public _base
{
    virtual void printPositive(int positive) = 0;
    virtual void printNegative(int negative) = 0;
    void print( int number) override
    { 
        _base::print(number);
        if (number >= 0)
            printPositive(number);
        else
            printNegative(number);
    }
};

struct Interface
{
    virtual void print( int number) = 0;
};

//implements the interface
struct NormalImplementer : public Interface
{
    void print( int number) override { std::cout << number << "\n"; }
};

//Still implements the interface
struct DifferentImplementer : public SplitPrint<NormalImplementer>
{
    void printPositive (int number) override { if (number > 10) std::cout << "big" << "\n"; }
    void printNegative (int number) override { if (number < -10) std::cout << "small" << "\n"; }
};

//Still implements the interface
struct TellSign : public SplitPrint<DifferentImplementer>
{
    void printPositive (int number) override { std::cout << "also, positive" << "\n"; }
    void printNegative (int number) override { std::cout << "also, negative" << "\n"; }
};


int main()
{
  NormalImplementer printer1;
  DifferentImplementer printer2;
  TellSign printer3;

  printer1.print(5); //5
  printer1.print(-42); //-42

  printer2.print(5); //5
  printer2.print(-42); //-42 small

  printer3.print(5); //5 also, positive
  printer3.print(-42); //-42 small also, negative
}
模板
struct SplitPrint:public\u base
{
虚空打印正(整数正)=0;
虚空打印负数(整数负数)=0;
无效打印(整数)覆盖
{ 
_基::打印(数字);
如果(数字>=0)
打印阳性(数字);
其他的
打印负片(数字);
}
};
结构接口
{
虚空打印(整数)=0;
};
//实现接口
结构NormalImplementer:公共接口
{
无效打印(整数)覆盖{std::cout
这个OOP问题有名字吗

是的,它叫

您也一直在使用的一个相关模式是

这个例子是解决C++中的问题的好方法吗? 取决于具体情况和用例。但这种风格本身并不坏,在许多API中都有使用。微软的ATL就是一个例子

< C++ >

有更好的/更清洁的方法来解决这个问题吗?
同样取决于您的用例。提供多个接口实现的方法不止一种。

这个问题可能属于@DanielT。它是基于我遇到的一个实际问题,所以默认情况下我没有认真考虑就发布了,但现在我再次阅读了我的问题,您可能是对的,可能是crosspos这个问题问到一个特定的C++编程问题,我认为它不需要迁移到SE软件工程。谢谢,这真的很有帮助。我会花一些时间来阅读OU提供的源。@ AlexandreTHOUVENIN,如果你能发现一些代码中使用的模式,这些都很容易找到;-)是的,但公平地说,我不喜欢。“我不知道超过3或4种设计模式,所以我通常会解决我的问题,然后继续前进。这一次,因为它看起来像一个一般的OOP问题,我想知道它是否已经有了(更好/类似的)解决方案。而且它有一个。称之为错误的顺序^”