- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知:
C++ 提供了三种不同类型的多态性。
最佳答案
对多态性的理解/要求
要理解多态性 - 正如计算科学中使用的术语 - 从对它的简单测试和定义开始是有帮助的。考虑:
Type1 x;
Type2 y;
f(x);
f(y);
f()
是执行一些操作,并被赋予值
x
和
y
作为输入。
To exhibit polymorphism,
f()
must be able to operate with values of at least two distinct types (e.g.int
anddouble
), finding and executing distinct type-appropriate code.
f()
以便它可以通过以下任何一种方式对多种类型进行操作:
#define f(X) ((X) += 2)
// (note: in real code, use a longer uppercase name for a macro!)
void f(int& x) { x += 2; }
void f(double& x) { x += 2; }
template <typename T>
void f(T& x) { x += 2; }
struct Base { virtual Base& operator+=(int) = 0; };
struct X : Base
{
X(int n) : n_(n) { }
X& operator+=(int n) { n_ += n; return *this; }
int n_;
};
struct Y : Base
{
Y(double n) : n_(n) { }
Y& operator+=(int n) { n_ += n; return *this; }
double n_;
};
void f(Base& x) { x += 2; } // run-time polymorphic dispatch
f
并带有 int
参数 - 根据所使用的多态机制和内联选择,编译器可能会避免为 f(double)
生成任何代码,或者在编译或链接时可能会丢弃某些生成的代码。 (上述所有机制,除了虚拟调度)template <typename Duck>
void do_ducky_stuff(const Duck& x) { x.walk().swim().quack(); }
do_ducky_stuff(Vilified_Cygnet());
std::enable_if
)有效地允许对参数多态性进行几组期望。例如,您可能会编码,当您正在处理的数据类型具有
.size()
成员时,您将使用一个函数,否则另一个不需要
.size()
的函数(但可能会以某种方式受到影响 - 例如使用较慢的 0x2518121413没有在日志中打印有用的消息)。当使用特定参数实例化模板时,您还可以指定临时行为,或者保留一些参数参数(
partial template specialisation )或不保留(
full specialisation )。
polymorphism - providing a single interface to entities of different types. Virtual functions provide dynamic (run-time) polymorphism through an interface provided by a base class. Overloaded functions and templates provide static (compile-time) polymorphism. TC++PL 12.2.6, 13.6.1, D&E 2.9.
strlen()
s, Base*
、 __FILE__
、字符串文字连接和宏的其他独特功能(仍然是邪恶的 ;-)) __LINE__
添加到
int
s 和
double
s 并且编译器产生:
std::string x;
int y = 0;
x += 'c';
y += 'c';
-1- Standard conversions are implicit conversions defined for built-in types. Clause conv enumerates the full set of such conversions. A standard conversion sequence is a sequence of standard conversions in the following order:
[Note: a standard conversion sequence can be empty, i.e., it can consist of no conversions. ] A standard conversion sequence will be applied to an expression if necessary to convert it to a required destination type.
double a(double x) { return x + 2; }
a(3.14);
a(42);
To be polymorphic, [
a()
] must be able to operate with values of at least two distinct types (e.g.int
anddouble
), finding and executing type-appropriate code.
x += 2
本身运行专门针对
a()
的代码,因此不是多态的。
double
的第二次调用中,编译器知道为“浮点提升”(标准第 4 节)生成适合类型的代码,以将
a()
转换为
42
。额外的代码在调用函数中。我们将在结论中讨论这一点的重要性。
int a, b;
if (std::cin >> a >> b)
f(a, b);
42.0
在 bool 上下文中在转换运算符的帮助下进行评估。这可以在概念上与上述主题中的标准转换中的“整体促销”等归为一组。
f(const std::string& x);
f("hello"); // invokes `std::string::string(const char*)`
void f()
{
typedef int Amount;
Amount x = 13;
x /= 2;
std::cout << x * 1.1;
}
std::cin
视为实数(即 6.5 而不是四舍五入为 6),我们只需要更改为
x
。
void f() void f()
{ {
typedef int Amount; typedef double Amount;
Amount x = 13; Amount x = 13.0;
x /= 2; x /= 2.0;
std::cout << double(x) * 1.1; std::cout << x * 1.1;
} }
typedef double Amount
:
template <typename Amount>
void f()
{
Amount x = 13;
x /= 2;
std::cout << x * 1.1;
}
template
或
int
实例化,并按预期工作。如果没有这些功能,我们将需要显式转换、类型特征和/或策略类,以及一些冗长、容易出错的困惑,例如:
template <typename Amount, typename Policy>
void f()
{
Amount x = Policy::thirteen;
x /= static_cast<Amount>(2);
std::cout << traits<Amount>::to_double(x) * 1.1;
}
关于c++ - C++中的多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5854581/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!