标签: virtual

从析构函数调用虚函数

这样安全吗?

class Derived:  public PublicBase, private PrivateBase
{
 ... 

   ~Derived()
   {
      FunctionCall();
   }

   virtual void FunctionCall()
   {
      PrivateBase::FunctionCall();
   }
}

class PublicBase
{
   virtual ~PublicBase(){};
   virtual void FunctionCall() = 0;
}

class PrivateBase
{
   virtual ~PrivateBase(){};
   virtual void FunctionCall()
   {
    ....
   }
}


PublicBase* ptrBase = new Derived();
delete ptrBase;
Run Code Online (Sandbox Code Playgroud)

此代码有时会在错误的地址中使用IP.

对于每个人来说,在构造函数上调用虚函数并不是一个好主意.

来自像http://www.artima.com/cppsource/nevercall.html这样的文章我明白析构函数也是一个不太适合调用虚函数的地方.

我的问题是"这是真的吗?" 我已经测试过VS2010和VS2005并且调用了PrivateBase :: FunctionCall.未定义的行为?

c++ virtual

37
推荐指数
2
解决办法
3万
查看次数

替代c ++静态虚拟方法

在C++中不可能声明静态虚函数,也不能将非静态函数强制转换为C样式函数指针.

现在,我有一个简单的ol'C SDK,它大量使用函数指针.

我必须用几个函数指针填充一个结构.我计划使用一个带有一堆静态纯虚方法的抽象类,并在派生类中重新定义它们并用它们填充结构.直到那时我才意识到在C++中不允许使用静态虚拟.

此C SDKs函数签名也没有userData参数.

有什么好的选择吗?我能想到的最好的方法是在每个派生类中定义一些纯虚方法GetFuncA(),GetFuncB(),...和一些静态成员FuncA()/ FuncB(),它们将由GetFuncX()返回.然后抽象类中的函数将调用这些函数来获取指针并填充结构.

编辑 回答John Dibling,能够做到这一点真是太好了:

class Base
{
    FillPointers() { myStruct.funA = myFunA; myStruct.funB = myFunB; ...}
private:
    CStruct myStruct;
    static virtual myFunA(...) = 0;
    static virtual myFunB(...) = 0;
};

class Derived1 : public Base
{
    Derived1() {  FillPointers();  }
    static virtual myFunA(...) {...};
    static virtual myFunB(...) {...};
};

class Derived2 : public Base
{
    Derived2() {  FillPointers();  }
    static virtual myFunA(...) {...};
    static virtual myFunB(...) {...};
};

int main()
{
    Derived1 d1; …
Run Code Online (Sandbox Code Playgroud)

c++ virtual static function-pointers

36
推荐指数
6
解决办法
5万
查看次数

C++虚拟模板方法

我有一个抽象类(我知道它不会以这种方式编译,但它是为了理解我想要做的事情):

class AbstractComputation {
    public:
        template <class T> virtual void setData(std::string id, T data);
        template <class T> virtual T getData(std::string id);
};

class Computation : public AbstractComputation {
    public:
        template <class T> void setData(std::string id, T data);
        template <class T> T getData(std::string id, T data);
};
Run Code Online (Sandbox Code Playgroud)

因此,当我打电话时,setData<double>("foodouble", data)我希望将foodouble(由此处不是主要关注的内部机制)识别的双精度设置为双精度数据.

那怎么办呢?

我认为通过输入类似的东西可能有一个意思,virtual void setData<double>(std::string id, double data)但我不知道该怎么做.

c++ virtual templates

35
推荐指数
2
解决办法
4万
查看次数

C++ 11中的纯虚函数

在C++ 98中,空指针由文字表示0(或实际上是值为零的任何常量表达式).在C++ 11中,我们更喜欢nullptr.但这对纯虚函数不起作用:

struct X
{
    virtual void foo() = nullptr;
};
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?这不是很有意义吗?这只是一个疏忽吗?它会被修复吗?

c++ virtual pure-virtual nullptr c++11

35
推荐指数
6
解决办法
1万
查看次数

检测虚拟键盘与硬件键盘

我一直在思考这个问题,我无法想办法解决这个问题.有没有办法检测用户是使用虚拟(软件)键盘还是传统(硬件)键盘?

新的Windows Surface在封面上有自己的键盘,对于Android/iPad,有大量不同的蓝牙键盘.

那么,你们中有人对此有任何意见吗?
我的目标是Android,IOS和Windows平板电脑/手机.


动机:(非常主观)

在开发平板电脑/智能手机的网络应用程序时,我已经认识到在许多情况下使用JavaScript键盘而不是操作系统的软件键盘会更容易.

假设您要输入PIN码.而不是让键盘填满屏幕的一半:

软件(OS)键盘:

|----------------|
|    [ input]    |
|                |
|----------------|
|  1  2  3  4  5 |
|  6  7  8  9  0 |
|----------------|
Run Code Online (Sandbox Code Playgroud)

JavaScript键盘:

|----------------|
|    [ input]    |
|    | 1 2 3|    |
|    | 4 5 6|    |
|    |_7_8_9|    |
|                |
|                |
|----------------|
Run Code Online (Sandbox Code Playgroud)

如果您需要处理大量输入,可能需要对输入进行叠加div并使用软件键盘:

|----------------|
| P1 P2    P3 P4 |
| [inp 1][inp 2] |
|----------------|
|    KEYBOARD    |
|                | …
Run Code Online (Sandbox Code Playgroud)

javascript keyboard jquery virtual tablet

34
推荐指数
2
解决办法
2万
查看次数

如何获取ASP.NET应用程序的完整虚拟路径

我如何知道我的应用程序当前托管的完整虚拟路径?例如:

http://www.mysite.com/myApp
Run Code Online (Sandbox Code Playgroud)

要么

http://www.mysite.com/myApp/mySubApp
Run Code Online (Sandbox Code Playgroud)

我知道HttpRequest的应用程序路径,但它只返回我的应用程序当前托管的文件夹名称,但是如何获取初始部分?

asp.net virtual path

33
推荐指数
4
解决办法
8万
查看次数

如何为二进制兼容的可扩展性设计C++ API

我正在为C++库设计一个API,它将分发在一个dll/shared对象中.该库包含具有虚函数的多态类.我担心如果我在DLL API上公开这些虚函数,我就不会使用更多虚函数扩展相同的类,而不会破坏与为以前版本的库构建的应用程序的二进制兼容性.

一种选择是使用PImpl习惯用法来隐藏所有具有虚函数的类,但这似乎也有它的局限性:这样,应用程序就失去了对类的子类进行子类化并覆盖虚方法的可能性.

您将如何设计一个可以在应用程序中进行子类化的API类,而不会失去在新版本的dll中使用(非抽象)虚拟方法扩展API同时保持向后二进制兼容的可能性?

更新:库的目标平台是windows/msvc和linux/gcc.

c++ virtual binary-compatibility

33
推荐指数
2
解决办法
2万
查看次数

如何限制OS X程序的内存?ulimit -v -m都没有工作

我的程序耗尽了内存,就像我运行它们的时间的一半.在Linux下,我可以使用ulimit -v mem-in-kbytes设置可用内存的硬限制.实际上,我使用ulimit -S -v mem-in-kbytes,所以我在程序中得到了正确的内存分配问题,我可以中止.

但是...... ulimit在OSX 10.6中不起作用.我尝试过使用-s和-m选项,但它们无法正常工作.

在2008年,MacRumors对同一个问题进行了一些讨论,但没有人提出一个好的选择.应该是一个程序可以学习它花费太多内存或通过操作系统设置限制的方式.

memory macos virtual launchd ulimit

32
推荐指数
3
解决办法
9045
查看次数

默认情况下包含在toJSON中的Mongoose虚拟字段:schemaOptions.toJSON.virtuals = true; 默认情况下仍不包括虚拟字段

我在另一个答案中看到,为了包含虚拟字段,您必须执行https://groups.google.com/forum/?fromgroups#!topic/mongoose-orm/HjrPAP_WXYs

var schemaOptions = {
  toJSON: {
    virtuals: true
  }
};
Run Code Online (Sandbox Code Playgroud)

我做过的;

现在在架构中:

 new Schema({...}, schemaOptions);
Run Code Online (Sandbox Code Playgroud)

但仍然如此,数据不包括虚拟..:s

但是像这样工作:

var docsCallback = function(err, docs){
    var i = docs.length;
    var nDocs = [];
    while(i--){
        nDocs[i] = docs[i].toObject({virtuals: true});
    }
    done(nDocs);
}
Run Code Online (Sandbox Code Playgroud)

virtual mongoose

32
推荐指数
2
解决办法
1万
查看次数

C#虚拟静态方法

为什么静态虚拟不可能?C#依赖还是在OO世界中没有任何意义?

我知道这个概念已被强调,但我没有找到上一个问题的简单答案.

c# generics methods virtual static

31
推荐指数
5
解决办法
2万
查看次数