显式重写(C++/CLI 和 C++/CX)
本主题探讨了如何显式重写基类或基接口的成员。 已命名(显式)重写应该只用于将方法重写为名称不同的派生方法。
所有运行时
语法
overriding-function-declarator = type::function [,type::function] { overriding-function-definition }
overriding-function-declarator = function { overriding-function-definition }
参数
overriding-function-declarator
重写函数的返回类型、名称和参数列表。 请注意,重写函数不必与被重写函数同名。
type
包含要重写的函数的基类型。
函数
一个或多个要重写的函数名称的逗号分隔列表。
overriding-function-definition
定义重写函数的函数主体语句。
注解
显式重写可用于创建方法签名的别名,或为签名相同的方法提供不同实现。
若要了解如何修改继承类型和继承类型成员的行为,请参阅重写说明符。
Windows 运行时
要求
编译器选项:/ZW
公共语言运行时
注解
若要了解本机代码或使用 /clr:oldSyntax
编译的代码中的显式重写,请参阅显式重写。
要求
编译器选项:/clr
示例
下面的代码示例展示了如何简单隐式重写和实现基接口中的成员(未使用显式重写)。
// explicit_override_1.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
ref class X : public I1 {
public:
virtual void f() {
System::Console::WriteLine("X::f override of I1::f");
}
};
int main() {
I1 ^ MyI = gcnew X;
MyI -> f();
}
X::f override of I1::f
下面的代码示例展示了如何使用显式重写语法来实现所有使用公共签名的接口成员。
// explicit_override_2.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
interface struct I2 {
virtual void f();
};
ref struct X : public I1, I2 {
virtual void f() = I1::f, I2::f {
System::Console::WriteLine("X::f override of I1::f and I2::f");
}
};
int main() {
I1 ^ MyI = gcnew X;
I2 ^ MyI2 = gcnew X;
MyI -> f();
MyI2 -> f();
}
X::f override of I1::f and I2::f
X::f override of I1::f and I2::f
下面的代码示例展示了函数重写的名称如何与它要实现的函数不同。
// explicit_override_3.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
ref class X : public I1 {
public:
virtual void g() = I1::f {
System::Console::WriteLine("X::g");
}
};
int main() {
I1 ^ a = gcnew X;
a->f();
}
X::g
下面的代码示例展示了实现类型安全集合的显式接口实现。
// explicit_override_4.cpp
// compile with: /clr /LD
using namespace System;
ref class R : ICloneable {
int X;
virtual Object^ C() sealed = ICloneable::Clone {
return this->Clone();
}
public:
R() : X(0) {}
R(int x) : X(x) {}
virtual R^ Clone() {
R^ r = gcnew R;
r->X = this->X;
return r;
}
};