什么是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;
}