覆盖GCC弃用消息

时间:2018-06-10 05:41:54

标签: c++ gcc override deprecated virtual-functions

在GCC中,当有人使用

调用已弃用的函数时,您可以创建弃用警告
class CreateSaleViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableViewMenu: UITableView!
    let options : Int = 12


    override func viewDidLoad() {

        tableViewMenu.dataSource = self
        tableViewMenu.delegate = self
        tableViewMenu.register(UINib(nibName: "CellCreateSaleVC", bundle: nil), forCellReuseIdentifier: "CellCreateSale")

    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return options
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CellCreateSale") as! CellCreateSaleVC
        return cell
    }

}

当有人覆盖类的虚方法时,您是否可以创建类似的弃用警告?

2 个答案:

答案 0 :(得分:1)

使用[[deprecated]][[deprecated(message)]]标准属性(自C ++ 14以来可用)在Visual Studio中产生预期效果,既可以使用已弃用的方法,也可以通过发出C4996警告来覆盖(可能是忽略)。我不能代表其他编译器,我希望因为这是标准的,他们也应该遵守。

class Base
{
public:
    [[deprecated("dont use, deprecated")]] virtual void foo()
    {
    }
};

class Derived : public Base
{
public:
    void foo() override 
    {
    }
};


int main()
{
    Base b;
    b.foo();
}

这将产生2个警告,一个用于覆盖,一个用于尝试使用,

答案 1 :(得分:0)

它会生成错误而不是警告,但您可以将final说明符添加到基类中的方法声明中。然后没有人可以覆盖它。

您还可以在运行时(而不是编译时)生成弃用消息,方法是调用该函数并查看它是否运行基类实现(通过在基类实现中设置一个标志,然后在呼叫)。