什么时候编译器创建一个虚函数表?
1)当类包含至少一个虚函数时.
要么
2)当直接基类包含至少一个虚函数时.
要么
3)当层次结构的任何级别的任何父类包含至少一个虚函数时.
与此相关的问题:是否可以放弃C++层次结构中的动态调度?
例如,考虑以下示例.
#include <iostream>
using namespace std;
class A {
public:
virtual void f();
};
class B: public A {
public:
void f();
};
class C: public B {
public:
void f();
};
Run Code Online (Sandbox Code Playgroud)
哪些类将包含V表?
既然B没有将f()声明为虚拟,那么C类是否会获得动态多态性?
也许我有两个具有相同功能名称和参数的接口,但具有不同的返回值:
struct A { virtual void foo() = 0; };
struct B { virtual int foo() = 0; };
Run Code Online (Sandbox Code Playgroud)
如何定义继承此接口的类C(如果可能的话)?例如,我写了一些未编译的伪代码:
// this code is fake, it doesn't compiled!!
struct C : A, B
{
// how to tell compiler what method using if referenced from C?
using void foo(); // incorrect in VS 2012
// and override A::foo() and B::foo()?
virtual void foo() { std::cout << "void C::foo();\n"; } // incorrect
virtual int foo() { std::cout << "int C::foo();\n"; return …Run Code Online (Sandbox Code Playgroud) 可能重复:
继承共享方法名称的接口
我有两个基类I1和I2纯虚函数void R() = 0;.我想在派生类IImpl要继承I1和I2并有不同的实现方式为I1::R()和I2::R().
下面的代码在MS VS 2005和2010中编译和工作.我在禁用语言扩展并且在警告级别4上进行编译.没有警告也没有错误.
我在gcc 4.2中尝试了相同的代码.它不编译.GCC报告错误:
error: cannot define member function 'I1::R' within 'IImpl'
Run Code Online (Sandbox Code Playgroud)
我的问题是:
谢谢!
#include <stdio.h>
class I1
{
public:
virtual void R() = 0;
virtual ~I1(){}
};
class I2
{
public:
virtual void R() = 0;
virtual ~I2(){}
};
class IImpl: public I1, public I2
{
public:
virtual void I1::R()
{
printf("I1::R()\r\n"); …Run Code Online (Sandbox Code Playgroud) 代码如下
// A has a virtual function F().
class A
{
public:
virtual void F() {};
};
// The same for B.
class B
{
public:
virtual void F() {};
};
// C inherits A and B.
class C : public A, public B
{
public:
// How to implement the 2 virtual functions with the same name but from
// different base classes.
virtual F() {...}
};
Run Code Online (Sandbox Code Playgroud)
请注意,基类中有一个F()的默认实现.
感谢Jan Herrmann和Spook.如果我们必须使用一些额外的帮助,下面是一个更简单的解决方案吗?
#include <iostream>
// A has a virtual function F(). …Run Code Online (Sandbox Code Playgroud) 好的,首先是示例代码; 这是我尝试传达我正在尝试做的事情,尽管它没有编译:
#include <iostream>
template <class T>
class Base
{
public:
virtual void my_callback() = 0;
};
class Derived1
: public Base<int>
, public Base<float>
{
public:
void my_callback<int>()
{
cout << "Int callback for Derived1.\n";
}
void my_callback<float>()
{
cout << "Float callback for Derived\n";
}
};
class Derived2
: public Base<int>
, public Base<float>
{
public:
void my_callback<int>()
{
cout << "Int callback for Derived2.\n";
}
void my_callback<float>()
{
cout << "Float callback for Derived2\n";
}
};
int …Run Code Online (Sandbox Code Playgroud) c++ templates overriding multiple-inheritance specialization
我遇到过我可以访问方法的应用程序:
void AttachCallback(int event, std::functional<void(int)> cb);
Run Code Online (Sandbox Code Playgroud)
这让我可以附加一个回调cb事件event.我还有几个类需要将回调附加到其构造函数中的几个事件,并为它们绑定的每个事件实现回调.因此,首先想到的实现看起来像:
class MyClass {
public:
MyClass() {
AttachCallback(0, [this](int value) { cb0(value); });
AttachCallback(2, [this](int value) { cb2(value); });
// ... as necessary
}
private:
void cb0(int value) { /*... callback for event 0 ...*/ }
void cb2(int value) { /*... callback for event 2 ...*/ }
// ... as necessary
};
Run Code Online (Sandbox Code Playgroud)
但是,由于我最近一直在玩模板很多,我想知道我是否可以创建一个模板化的纯虚拟类来监听给定的事件并使用它如下:
template<const int EVENT>
class ListensToEvent {
public:
virtual ~ListensToEvent() = default;
protected:
ListensToEvent() {
AttachCallback(EVENT, [this](int …Run Code Online (Sandbox Code Playgroud) 我有以下代码使用多重继承.目的是在派生类中使用两个接口作为一个接口:
struct InterfaceA
{
virtual void register_stuff();
virtual void on_state_changed( const State state ) = 0;
};
struct InterfaceB
{
virtual void register_stuff();
virtual void on_state_changed( const State state ) = 0;
};
struct Derived : InterfaceA, InterfaceB
{
void register_stuff() override
{
InterfaceA::register_stuff();
InterfaceB::register_stuff();
}
void on_state_changed( const State state ) override
{
// how can I know who is responding?
}
};
Run Code Online (Sandbox Code Playgroud)
注册接口将导致异步调用on_state_changed.是否有可能辨别哪个接口正在调用它?
在我的C++程序中,我有两个类(B1和B2),它们有自己的方法,但有1个("意外").例如:
B1类标题:
void height();
void size();
void enabled();
Run Code Online (Sandbox Code Playgroud)
B2级标题:
void width();
void length();
void enabled();
Run Code Online (Sandbox Code Playgroud)
现在我有一个继承自B1和B2的A类.由于enabled()多重继承后方法中存在"冲突",我该如何避免这种情况?有没有办法从继承中排除方法?例如,我可以enabled()从B1类中排除继承(我不能将其设置为私有,因为它是从B1派生的其他类中使用的).还有其他想法吗?
c++ ×8
overriding ×2
templates ×2
gcc ×1
inheritance ×1
polymorphism ×1
visual-c++ ×1
vtable ×1