如果在cpp代码中判断子类有没有重写父类接口
时间: 2023-02-11 22:24:54 浏览: 139
可以使用 `typeid` 和 `dynamic_cast` 来判断子类是否重写了父类的接口。具体实现方法如下:
```cpp
class Base {
public:
virtual void foo() { }
};
class Derived : public Base {
public:
virtual void foo() override { }
};
int main() {
Base* b = new Derived();
if (typeid(*b) == typeid(Derived)) {
Derived* d = dynamic_cast<Derived*>(b);
if (d) {
std::cout << "Derived has overridden Base's foo()" << std::endl;
}
}
delete b;
return 0;
}
```
在这个例子中,首先使用 `typeid` 来检查对象的类型是否为 `Derived`,然后使用 `dynamic_cast` 将指向基类的指针强制转换为指向派生类的指针,如果转换成功(d不是null),则说明子类重写了父类的接口.
另外需要注意的是,需要保证父类接口为虚函数,子类重写父类接口要使用 override关键字.
相关问题
如果在cpp代码中判断子类有没有重写父类的某个虚接口
在 C++ 代码中判断子类有没有重写父类的某个虚函数,可以使用 typeid 运算符和 dynamic_cast 运算符。
使用 typeid 运算符可以获取对象的类型信息,并且可以使用 typeid(类名) 获取类型信息。如果一个子类重写了父类的虚函数,那么对于子类的对象来说,使用 typeid 获取到的类型信息应该是子类的类型。
使用 dynamic_cast 运算符可以进行运行时的类型转换,并且如果该转换失败,会返回一个空指针。如果一个子类重写了父类的虚函数,那么对于子类的对象来说,使用 dynamic_cast 将该对象转换成父类指针时,返回的结果应该是一个非空指针。
示例代码如下:
```cpp
class Parent {
public:
virtual void func() {}
};
class Child : public Parent {
public:
virtual void func() override {}
};
int main() {
Child c;
Parent& p = c;
if (typeid(p) == typeid(Child)) {
std::cout << "Child has overridden the virtual function of Parent." << std::endl;
}
if (dynamic_cast<Child*>(&p) != nullptr) {
std::cout << "Child has overridden the virtual function of Parent." << std::endl;
}
return 0;
}
```
在这个例子中, 因为c为 Child 类型,转换成 Parent 引用 会输出 Child has overridden the virtual function of Parent.
在这两种方法中,dynamic_cast 通常
如果在cpp代码中判断子类有没有重写父类的哪些虚接口,没有重写哪些虚接口
可以使用 dynamic_cast 来判断某个对象是否重写了父类的虚函数。如果转换成功,则说明该函数已被重写,如果转换失败,则说明该函数没有被重写。
可以如下判断子类是否重写了父类的虚函数func()
```
class Base {
public:
virtual void func() {}
};
class Derived: public Base {
// 重写
void func() override {}
};
Derived obj;
if(dynamic_cast<Base*>(&obj) == &obj) {
std::cout << "obj 没有重写父类的 func() 函数" << std::endl;
} else {
std::cout << "obj 重写了父类的 func() 函数" << std::endl;
}
```
注意:父类的函数要被声明为虚函数。如果父类函数没有声明为虚函数,编译器不会认为子类重写父类函数,从而dynamic_cast会失败。
阅读全文