什么是C++单态类,这是一个例子吗?

什么是C++单态类,这是一个例子吗?,c++,oop,class,monomorphism,C++,Oop,Class,Monomorphism,请告诉我,如果下面的类是单态的 什么使它是单态的?单态究竟是什么意思 class Foo { public: Foo(int n) { this->m = n; } void print() { std::cout << this->m << std::endl; } private: int m; }; 首先,为了回答这个问题,我们需要研究单态的真正含义。要做到这一

请告诉我,如果下面的类是单态的

什么使它是单态的?单态究竟是什么意思

class Foo
{
public:
    Foo(int n)
    {
        this->m = n;
    }

    void print()
    {
        std::cout << this->m << std::endl;
    }

private:
    int m;
};

首先,为了回答这个问题,我们需要研究单态的真正含义。要做到这一点,让我们将单词分解为:

mono - morphic 这是一个完全有效的接口,它将按预期工作。但是,没有任何东西可以阻止将以下类放置到函数中:

class B {
    public:
    void print() { puts("I'm in B!"); }
};
这显然会打印一个不同的值


<>最后,C++是一种复杂的语言,如果你真的希望一个类不能多态,你需要把所有成员和函数都私有化,这就破坏了首先有一个对象的目的。

< P>我在1997中遇到了一个术语,在C++语言的上下文中使用了单态这个词。这个术语似乎很少被使用,其他地方意味着它可能在90年代被C++中的浮动,但没有获得太多的牵引力,不再使用。该条规定:

问题如下:

考虑以下类定义:

class TFoo : public TSuperFoo {
    TBar* fBar1;
    TBar* fBar2;
    // various method definitions go here...
}
您有一个类TFoo,它是从类TSuperFoo和 它有两个数据成员,都是指向 TBar类。为了这个练习的目的,同时考虑两个指针 拥有自己的语义,TBar是一个单态类。写下 此类的赋值运算符

查看各种字典定义,最常见的根同态定义为具有特定的形式或形状,后面有一些指示,表明它通常与某些前缀一起使用,如poly-polymorphic或homo-homomorphic

前缀mono通常被定义为single或one或lone,通常与一些后缀一起使用,如平面单翼飞机或单翼飞机或单轨或单轨

在这种情况下,以及似乎存在的问题,单形单形被用作多态多形的对立面。单态类是不作为任何其他类的基类使用的类,也不是从另一个类派生的类

单态类的更严格定义是,该类还必须仅使用单态类或内置数据类型。作为其定义或行为的一部分,单态类不得包含任何多态类

这确实提出了一个问题:严格的单态类是否可以包含模板化变量或方法。我的第一个直觉是,只要模板创建了一个单态类,就可以了。换言之,如果编译器正在为您编写一个单态类,这与行下面隔间中的Sally编写它是一样的

那么,严格的定义是否应该排除运行时多态性

因此,根据第一个不太严格的单态类定义,问题中的类Foo是单态的,因为它不是从任何其他类派生的,也没有虚拟析构函数,这意味着它不打算用来派生另一个类,也没有任何虚拟方法

但是它在print方法中使用std::cout,并且std::cout肯定是多态的。所以说这是一个半单态类可能更准确,因为它使用的是多态类

看来单态类是独立的。但是,我们如何编写一个类,使其独立,并且编译器将标记从该类派生另一个类的任何尝试

C++允许一个类通过从现有类派生一个新类而成为其他类的超类。关于什么是可能的,多态性如何成功工作,有时有许多非常复杂的规则,但是最终使用final关键字C++11与类一起使用是创建一个无法派生另一个类的类的唯一合理方法

尽管浏览了一下,我还是发现了这篇文章,它提供了一个使用私有构造函数和虚拟继承的方法


如何定义单态?我不认为你指的是代数的性质:但是我从来没有见过其他地方使用的术语。请注意C++与java或PHP不一样。在C++中,构造函数通常写得很不一样。在这个场景中,BOO与FO有什么关系?关于C++中的术语单态性的问题。不久前,我发现了这样一个术语,不明白它是什么。结果是很愚蠢的问题;变形的意思是与形式或形状有关的,不可变换的。“单态”意味着只有一种形式或形状。@juanchopanza你说的是土豆,我说的是土豆。在实际应用中,在我的书中,变形意味着改变。谢谢你的时间和回答,Richard。非常有趣!
class B {
    public:
    void print() { puts("I'm in B!"); }
};
class TFoo : public TSuperFoo {
    TBar* fBar1;
    TBar* fBar2;
    // various method definitions go here...
}
/* A program without any compilation error to demonstrate that instances of 
   the Final class can be created */
#include<iostream>
using namespace std;

class Final;

class MakeFinal
{
private:
    MakeFinal() { cout << "MakeFinal constructor" << endl; }
    friend class Final;
};

class Final : virtual MakeFinal
{
public:
    Final() { cout << "Final constructor" << endl; }
};

int main(int argc, char *argv[])
{
    Final f;
    return 0;
}