代码之家  ›  专栏  ›  技术社区  ›  Jagannath

评论这段c++代码

c++
  •  1
  • Jagannath  · 技术社区  · 16 年前

    class Base
    {
        public:
            virtual void process() = 0;
    };
    
    class ProductA : public Base
    {
        public:
        void process()
        {
            // some implementation.
            doSomething();
        }
    
        void setSomething(int x)
        {
    
        }
    
        virtual void doSomething()
        {
             // doSomething.
        }
    
    };
    
    class ProductANew : public ProductA
    {
        public:
            ProductANew() : ProductA() { }
            void doSomething()
            {
               // do Something.
            }
    };
    
    
    int main(int argc, char *argv[])
    {
        Base* bp = new ProductANew();
        dynamic_cast<ProductA*>(bp)->setSomething(10);
        bp->process();
    }
    
    4 回复  |  直到 16 年前
        1
  •  7
  •   sharptooth    16 年前

    有了好的设计,你就不需要 dynamic_cast process() 不打电话就不能打 setSomething() 首先,它们应该暴露在同一个基类中。

        2
  •  19
  •   anon anon    16 年前

    一些问题:

    • 您永远不会删除分配了new的对象
        3
  •  3
  •   JoeG    16 年前

    有一个实际的错误和一堆危险/可疑的做法:


    唯一的错误是你从不打电话 delete new 把东西弄脏了,所以漏了。


    可疑做法:

    1. Base 删除 或者使用 auto_ptr
    2. 这里根本不需要使用动态分配。
    3. 多态基类应该是不可压缩的,以防止对象切片。
    4. 你用的是 dynamic_cast 如果没有必要并且没有检查结果-为什么不直接声明呢 bp 作为指向 ProductANew ProductNew ?
    5. 不需要构造函数-默认的就可以了。

    其中有几点可能是示例性质的结果,即您有充分的理由使用动态分配,但您希望示例保持较小。

        4
  •  1
  •   JUST MY correct OPINION    16 年前

    一般来说,你会发现甚至不能编译的代码设计得很糟糕。

    Base* bp = new ProductANew();
    

    这一行不能工作,因为ProductANew不是以任何方式、形状或形式从Base继承的。

    $ gcc junk.cc
    junk.cc: In function ‘int main(int, char**)’:
    junk.cc:41: error: cannot convert ‘ProductANew*’ to ‘Base*’ in initialization
    


    编辑以添加。。。

    后来者在投票前可能想看看原始问题的历史